如果插入用户输入而不修改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)
可以采取哪些措施来防止这种情况发生?
我正在尝试生成河豚哈希,我想知道它是否足够安全,可以依靠mt_rand()来为我生成盐?
function blowfish($string, $salt = NULL, $iterations = '08')
{
if( ! $salt)
{
$seed = "./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
for ($i = 0; $i < 22; $i++)
{
$salt .= $seed{mt_rand(0, 63)};
}
$salt = '$2a$' . $iterations . '$' . $salt;
}
return crypt($string, $salt);
}
Run Code Online (Sandbox Code Playgroud)
上面的字符$ seed是允许的64个字符的河豚盐字母表.我打算用它来生成和比较密码.
$password = 'my^$%#password';
$hash = blowfish($password);
if($hash = blowfish($password, $hash))
{
print "Matches\n";
print $hash . "\n";
}
Run Code Online (Sandbox Code Playgroud)
我从来没有意识到这一点,但@zerkms说的是真的.盐只是为了防止可重复使用的预先计算的攻击,因为盐在他们可以访问哈希的同一点上是已知的.所以目标不是一种不可逆的盐 - 它是一种随机的盐.
那么,这有什么不对吗?
function blowfish($string, $salt …Run Code Online (Sandbox Code Playgroud)