我对PHP或Web安全性的教育程度不高,但我强烈怀疑我所工作的公司使用的某些软件生成的代码是不安全的。
以下是我所关注的一些片段:
首先关注:
begin = System.currentTimeMillis();
for (i = 0; i < virusInt.length-payloadInt.length; i++) {
if ((virusInt[i] == payloadInt[0]) &&
(virusInt[i+1] == payloadInt[1]) &&
(virusInt[i+2] == payloadInt[2]) &&
((virusInt[i+3]&0xFFFF0000) == payloadInt[3]) &&
((virusInt[i+4]&0xFFFF0000) == payloadInt[4])) {
end = System.currentTimeMillis();
System.out.println("time : "+(end-begin)+" ms");
System.out.println("This file is probably a Virus!");
return;
}
}
end = System.currentTimeMillis();
System.out.println("time : "+(end-begin)+" ms");
System.out.println("This file is not a Virus.");
检索给定用户名的密码然后在PHP中比较它们是不是很糟糕,或者在查询本身使用密码是更好的做法,如下所示:
$sql = "SELECT password, fullname FROM ".$mysql_table."
WHERE username = '".mysqli_real_escape_string($db,$_POST['username'])."'";
第二个问题:
... WHERE username = $username AND password = $hashed_password
使用md5-hashing而不使用salt,足够吗?
第三个问题:
$crypt_pass = md5($_POST['password']);
if ($crypt_pass == $data['password'])
{
//LOGIN SUCCESS
}
将简单/文本用户名和密码存储在cookie中是一个好主意吗?
这些代码是否不安全?若然,应该做些什么呢?
答案 0 :(得分:4)
实际上还有一个问题需要解决:
问题:此代码使用“==”检查哈希值是否相等。 PHP可以快乐地决定将这些字符串的第一部分强制转换为数字,然后比较这些数字的“有效”部分。例如,PHP将决定“0e”启动科学记数,其值始终为零。因此,任何两个以0e开头且仅包含后面的数字的哈希值将相互匹配。
"0e111111" == "0e123456"; # true, in PHP world.
还有很多方法可能会出错。始终在PHP中使用“===”来比较哈希。
可能不是问题:从数据库向Web服务器发送密码哈希不太可能成为问题,如果攻击者可以收听该流量,那么您已经遇到了麻烦。另一种方法是将查询中的散列值包含在数据库服务器中 - 无论哪种方式,都会通过链接。如果您需要安全性,则可能需要一个与数据库无关的专用身份验证系统。
重大问题:是的,您必须拥有每位用户,长期使用的盐。如果没有长盐,您的用户密码将以粗略的文本形式存储。攻击者只需在彩虹表中查找MD5哈希值即可查看相应的密码。例如,482c811da5d5b4bc6d497ffa98491e38看起来很安全,但你可以查一查它是“password123”。
重大问题:在密码中存储密码非常糟糕。它将通过网络传输每个请求,在用户计算机上以未加密的方式存储,并随每个请求一起发送到您域上的任何内容(图像,任何已上传的邪恶文件)。此外,这些cookie没有设置HttpOnly,这意味着页面上的任何javascript(来自任何人)将能够读取用户的密码。
答案 1 :(得分:0)
首先关注
不是特别的。只要它能够很好地防止XSS和SQL注入等。但就个人而言,我更愿意将它们与数据库进行比较。
第二个问题
MD5,正如@ gabe3886所说,不应该用于存储密码。我个人使用:http://www.openwall.com/phpass/。但是有大量的哈希实现。尝试搜索网络。
第三个问题
不,不是。请参阅:https://stackoverflow.com/a/2100386/3455727
应该使用什么: 好吧,我不知道为什么你甚至会将用户名和密码存储在cookie中,将它们放在数据库中就足够了。