我对PHP或Web安全性的教育程度不高,但我强烈怀疑我正在使用的公司使用的某些软件生成的代码是不安全的.
以下是我所关注的一些片段:
第一个问题:
$sql = "SELECT password, fullname FROM ".$MysqL_table."
WHERE username = '".MysqLi_real_escape_string($db,$_POST['username'])."'";
检索给定用户名的密码然后在PHP中比较它们是不是很糟糕,或者在查询本身中使用密码是更好的做法,如下所示:
... WHERE username = $username AND password = $hashed_password
第二个问题:
$crypt_pass = md5($_POST['password']);
if ($crypt_pass == $data['password'])
{
//LOGIN SUCCESS
}
使用md5-hashing而不使用salt,够了吗?
第三个问题:
setcookie('username', $_POST['username'], time() + 3600*24*30);
setcookie('password', $_POST['password'], time() + 3600*24*30);
将简单/文本用户名和密码存储在cookie中是一个好主意吗?
这些代码是否不安全?如果是这样,应该做些什么?
解决方法:
实际上还有一个问题是你缺少的:
问题:此代码使用“==”检查哈希值是否相等. PHP可以快乐地决定将这些字符串的第一部分强制转换为数字,然后比较这些数字的“有效”部分.例如,PHP将决定“0e”启动科学记数,其值始终为零.因此,任何两个以0e开头且仅包含后面的数字的哈希值将相互匹配.
“0e111111”==“0e123456”;在PHP世界中,#true.
还有很多方法可能会出错.始终在PHP中使用“===”来比较哈希.
可能不是问题:从数据库向Web服务器发送密码哈希不太可能成为问题,如果攻击者可以收听该流量,那么您已经陷入了深深的麻烦.另一种方法是将查询中的散列值包含在数据库服务器中 – 无论哪种方式,都会通过链接.如果您需要安全性,则可能需要一个与数据库无关的专用身份验证系统.
主要问题:是的,你必须每个用户,长,盐.如果没有长盐,您的用户密码将以粗略的文本形式存储.攻击者只需在彩虹表中查找MD5哈希值即可查看相应的密码.例如,482c811da5d5b4bc6d497ffa98491e38看起来很安全,但您可以查找它,找出它是“password123”.
主要问题:在密码中存储密码非常糟糕.它将通过网络传输每个请求,在用户计算机上以未加密的方式存储,并随每个请求一起发送到您域上的任何内容(图像,任何已上传的邪恶文件).此外,这些cookie没有设置HttpOnly,这意味着页面上的任何javascript(来自任何人)将能够读取用户的密码.