我正在编写一个允许用户注册的PHP站点,注册和未注册用户都可以为学校站点输入各自的用户名和密码(例如smith8h4ft
- j9hsbnuio
)。
然后,我的PHP脚本发送一些$_POST
变量,下载并解析标记页面,制作一个名为的数组:
marksDB = Array("subject" => Array("A", "B", "A", "C"), ...)
,并将其重新格式化。
我的问题是: 如何确保用户名和密码安全?
对于未注册的用户,我目前忘记了用户名和密码,并将marksDB
放入$_SESSION
。当用户处于非活动状态时30分钟后,marksDB被删除。这些数据在$_SESSION
中的安全性如何?用户如何登录,查看页面一次,再也不会再查看,因此脚本不会从会话中删除marksDB?会话是否自动删除(gc.maxlifetime)?
那么注册用户呢?我希望一切都安全,但我不想每30分钟不活动就用密码提示来惹恼用户。加密如here所描述的凭证,但没有第三个用户设置的密码是否安全?或者我每次都要问用户他的密码?
修改
感谢您的快速回复,
@Justinᚅᚔᚈᚄᚒᚔ:我怀疑他们有一些API,但我可以问他们,只是为了案例
@Abid Hussain:感谢非常有用的链接。 (也谢谢你的回答)
我会抛弃用户'凭证离开并且只解析了markDB
,我可能会扔掉它(在退出或不活动之后) - 在需要时再次检索标记很便宜。
答案 0 :(得分:2)
如果学校网站没有公开API(例如using OAuth like the StackExchange sites do),那么您的选项有限。
一般来说,将用户的明文凭据保留的时间绝对超过绝对必要永远不是一个好主意。对于尝试执行此操作的任何可能方式(会话劫持,被盗密钥,解密等)都存在安全隐患。
更好的方法可能是使标记下载过程严格由用户启动。给他们一个“检索我的标记”的按钮,然后在那里完成身份验证过程,下载标记并丢弃他们的凭据。每次他们“同步”时,他们都必须进行身份验证。除非标记经常定期更改,否则您无法一次性下载所需的所有信息,然后将其安全地缓存在服务器上以供日后使用。
答案 1 :(得分:1)
请参阅网址
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
safest way to create sessions in php
同时阅读
会话比使用cookie更安全。但是仍然可以窃取一个会话,因此黑客可以完全访问该会话中的任何内容。一些避免这种情况的方法是IP检查(它工作得很好,但是非常低,因此它本身不可靠),并且使用随机数。通常使用nonce,你有一个每页"令牌"这样每个页面都会检查最后一页的nonce是否与它存储的内容相匹配。
在任何安全检查中,都会失去可用性。如果您进行IP检查,并且用户位于内部网防火墙(或导致此问题的任何其他情况)后面,并且该用户没有稳定的IP,则每次丢失IP时都必须重新进行身份验证。使用随机数,您将获得永远的乐趣"单击返回将导致此页面中断"情况。
但是使用cookie,黑客只需使用相当简单的XSS技术即可窃取会话。如果您将用户的会话ID存储为cookie,则他们也容易受到攻击。因此,即使会话只能被可以执行服务器级别的黑客攻击(这需要更复杂的方法和通常一些特权,如果您的服务器是安全的),您仍然需要一些额外的验证级别每个脚本请求。你不应该一起使用cookie和AJAX,因为如果你的cookie被盗,这会让你更容易完全去城里,因为你的ajax请求可能无法对每个请求进行安全检查。例如,如果页面使用nonce,但页面永远不会重新加载,则脚本可能只检查该匹配。如果cookie持有身份验证方法,我现在可以使用被盗的cookie和AJAX漏洞去城镇做我的邪恶。
答案 2 :(得分:0)
会话文件是服务器端,因此它应该对客户端不可见。但如果他们知道会话ID,他们仍然可以欺骗你的程序使用另一个会话。
对于注册用户,您可以使用只有您知道的密钥(可能是随机生成并为每个用户存储的新密钥)对密码进行加密后,将密码存储在数据库或文件中。
答案 3 :(得分:0)
会话文件,但是在_SESSION
中存储的一个好的经验法则只是存储在屏幕上输出的数据,即密码可能不是你想存储在会话中。可以从服务器读取会话文件,并且某些恶意用户可能会劫持会话并查看他们不应该看到的内容,甚至可以看到某个var_dump($_SESSION)
。
如果您希望允许注册用户使用更长的会话,您可以使用JS定期刷新页面(不一定刷新页面......只是异步请求会执行),或者如果允许,甚至可以使用ini_set
增加会话时间。重复询问密码并不是必然更安全..这取决于您询问时密码的易受攻击程度。
另一个解决方案是让臭名昭着的“记住我”cookie让用户登录。
密码不用于解密。加密保密。哈希进行身份验证。
答案 4 :(得分:0)
会话中的所有内容都是服务器端,因此其他人无法访问。但是,如here所述,会话可能会被“劫持”。
您可以在PHP.ini中增加会话的长度,或者在后台使用定期的AJAX调用来保持会话处于活动状态。会话在服务器过期时将被删除。
除非没有替代方案,否则加密密码以便解密通常是不受欢迎的。通过加密,您不仅可以访问数据库和/或源代码,还可以检索密码。