7

我正在编写一个允许用户注册的 PHP 站点,注册用户和未注册用户都可以为学校站点输入各自的用户名和密码(例如smith8h4ft- j9hsbnuio)。

然后,我的 PHP 脚本发送一些$_POST变量,下载并解析标记页面,创建一个名为: 的数组 marksDB = Array("subject" => Array("A", "B", "A", "C"), ...),并将其重新格式化。

我的问题是: 我应该如何保证用户名和密码的安全?

对于未注册的用户,我目前忘记了用户名和密码,marksDB并将$_SESSION. 当用户处于非活动状态例如 30 分钟时,marksDB 将被删除。这些数据的安全性如何$_SESSION?那些登录的用户,查看一次页面,然后再也没有查看过,所以脚本不会从会话中删除marksDB?会话是否自动删除(gc.maxlifetime)?

那么注册用户呢?我希望一切安全,但我不想每隔 30 分钟不活动就用密码提示来惹恼用户。像这里描述的那样加密凭据是否安全,但没有第三个用户设置的密码?还是我每次都要向用户询问他的密码?

编辑:

感谢您的快速回复,
@Justin ᚅᚔᚈᚄᚒᚔ:我怀疑他们有一些 API,但我可以问他们,以防万一
@Abid Hussain:感谢非常有用的链接。(也感谢两位的回答)。
我会扔掉用户的凭据并且只解析markDB,我可能也会扔掉(在注销或不活动之后) - 在需要时再次检索标记很便宜。

4

5 回答 5

1

如果学校站点没有为此公开 API(例如,像 StackExchange 站点那样使用 OAuth),那么您的选择将受到限制。

一般而言,将用户的明文凭据保留超过绝对必要的时间绝不是一个好主意。您可以想象到的任何可能的尝试方式(会话劫持、被盗密钥、解密等)都存在安全隐患。

更好的方法可能是使标记下载过程严格由用户启动。给他们一个按钮,上面写着“检索我的标记”,然后在那里完成身份验证过程,下载标记,然后扔掉他们的凭据。每次他们“同步”时,他们都应该进行身份验证。除非标记经常定期更改,否则没有理由不能一次下载所需的所有信息,然后将其安全地缓存在服务器上以供以后使用。

于 2012-08-07T15:27:27.510 回答
0

见网址

http://phpsec.org/projects/guide/4.html

http://www.sitepoint.com/blogs/2004/03/03/notes-on-php-session-security/

http://talks.php.net/show/phpworks2004-php-session-security

http://segfaultlabs.com/files/pdf/php-session-security.pdf

在 php 中创建会话的最安全方法

也读它

会话比 cookie 安全得多。但是仍然有可能窃取会话,因此黑客可以完全访问该会话中的任何内容。避免这种情况的一些方法是 IP 检查(效果很好,但 fi 非常低,因此本身不可靠),以及使用随机数。通常使用 nonce,您有一个每页的“令牌”,以便每个页面检查最后一页的 nonce 是否与它存储的内容匹配。

在任一安全检查中,都会失去可用性。如果您进行 IP 检查并且用户位于 Intranet 防火墙(或导致此情况的任何其他情况)后面,该防火墙没有为该用户保留稳定的 IP,则他们每次丢失 IP 时都必须重新进行身份验证。使用随机数,您会得到“点击返回将导致此页面中断”的总是很有趣的情况。

但是使用 cookie,黑客可以通过使用相当简单的 XSS 技术来窃取会话。如果您将用户的会话 ID 存储为 cookie,他们也容易受到此攻击。因此,即使会话仅对可以进行服务器级黑客攻击的人来说是可渗透的(如果您的服务器是安全的,这需要更复杂的方法并且通常需要一定数量的权限),您仍然需要一些额外的验证级别根据每个脚本请求。您不应该同时使用 cookie 和 AJAX,因为如果该 cookie 被盗,这会使您更容易完全进入城镇,因为您的 ajax 请求可能不会对每个请求进行安全检查。例如,如果页面使用随机数,但从不重新加载页面,则脚本可能只检查该匹配。如果 cookie 持有认证方法,

于 2012-08-07T15:15:35.203 回答
0

会话文件将在一定时间后被垃圾收集器删除,但存储的一个好的经验法则_SESSION是只存储您将在屏幕上输出的数据,即密码可能不是您想要存储在会话中的东西。会话文件可以从服务器读取,一些恶意用户可能会劫持会话并看到他们不应该看到的东西,甚至以某种方式看到var_dump($_SESSION).

如果您想允许注册用户更长的会话,您可以使用 JS 定期刷新页面(不一定刷新页面......只需一个异步请求即可),或者ini_set如果允许,甚至可以增加会话时间。反复询问密码不一定更安全..这取决于您询问时密码的脆弱程度

另一个解决方案是让臭名昭著的“记住我”cookie 让用户保持登录状态。

密码不用于解密。加密保密。用于身份验证的哈希。

于 2012-08-07T14:20:44.957 回答
0

会话中的所有内容都是服务器端的,因此其他人无法访问。但是,会话可能会被“劫持”,如此所述。

您可以在 PHP.ini 中增加会话的长度,或者在后台使用定期 AJAX 调用来保持会话处于活动状态。会话在服务器过期时被删除。

除非别无选择,否则通常不赞成对密码进行加密以便对其进行解密。通过加密,不仅您,而且其他有权访问您的数据库和/或源代码的人都可以检索密码。

于 2012-08-07T14:35:56.393 回答
-1

会话文件是服务器端的,因此它应该对客户端不可见。但是如果他们知道会话 ID,他们仍然可以欺骗您的程序使用另一个会话。

对于注册用户,您可以在使用只有您知道的密钥对其进行加密后将密码存储在数据库或文件中(可能是随机生成并为每个用户存储的新密码)

于 2012-08-07T14:17:47.910 回答