如果插入用户输入而不修改SQL查询,则应用程序容易受到SQL注入的攻击,如下例所示:
$unsafe_variable = $_POST['user_input'];
mysql_query("INSERT INTO `table` (`column`) VALUES ('$unsafe_variable')");
Run Code Online (Sandbox Code Playgroud)
这是因为用户可以输入类似的内容value'); DROP TABLE table;--
,查询变为:
INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')
Run Code Online (Sandbox Code Playgroud)
可以采取哪些措施来防止这种情况发生?
我不时听到"使用bcrypt在PHP中存储密码,bcrypt规则"的建议.
但是什么bcrypt
呢?PHP没有提供任何此类功能,维基百科关于文件加密实用程序的唠叨和Web搜索只是揭示了不同语言的Blowfish的一些实现.现在Blowfish也可以通过PHP获得mcrypt
,但是如何帮助存储密码?Blowfish是一种通用密码,它有两种工作方式.如果它可以加密,则可以解密.密码需要单向散列函数.
解释是什么?
我看到哈希和加密算法之间存在很多混淆,我希望听到一些更专业的建议:
何时使用哈希与加密
什么使哈希或加密算法不同(从理论/数学水平),即什么使哈希不可逆(没有彩虹树的帮助)
以下是一些类似的 SO问题,没有像我想要的那样详细说明:
我已经长时间使用了无盐的md5/sha1,但由于这种方法不太安全(并且随着时间的推移变得越来越不安全)我决定切换到盐渍的sha512.此外,我想通过使用许多迭代(例如100)来减慢散列的生成.
我的问题是我是应该在每次迭代时添加盐还是在开始时只添加一次.以下是两个可能的代码:
每次追加:
// some nice big salt
$salt = hash($algorithm, $salt);
// apply $algorithm $runs times for slowdown
while ($runs--) {
$string = hash($algorithm, $string . $salt, $raw);
}
return $string;
Run Code Online (Sandbox Code Playgroud)
追加一次:
// add some nice big salt
$string .= hash($algorithm, $salt);
// apply $algorithm $runs times for slowdown
while ($runs--) {
$string = hash($algorithm, $string, $raw);
}
return $string;
Run Code Online (Sandbox Code Playgroud)
我首先想要使用第二个版本(追加一次)但后来发现每次添加盐的一些脚本.
所以,我想知道每次添加它是否会增加哈希的强度.例如,攻击者是否有可能找到一种聪明的方法来创建一个100XSha512函数,这比简单地执行sha512 100倍?
cryptography ×3
php ×3
security ×3
passwords ×2
bcrypt ×1
encryption ×1
hash ×1
mysql ×1
sql ×1