快一个。
我正在将使用 mysql 的旧 Web 应用程序迁移到 mysqli。我曾经使用我编写的自定义卫生功能来防止 SQL 注入(inject):
function sani($text=""){
if (!is_array($text)) {
$text = str_replace("<", "<", $text);
$text = str_replace(">", ">", $text);
$text = str_replace("\"", """, $text);
$text = str_replace("'", "'", $text);
return $text;
}
}
他们的方式我曾经使用过这个:
mysql_query("SELECT * FROM `table` WHERE `username` = '" . $sani($userinput) . "'");
基本上它所做的就是更改可用于注入(inject) html 编码的符号。到目前为止,它一直运行良好,但由于我正在迁移到 mysqli, 我想知道准备好的语句是否比这个函数更安全。
另外,我已经阅读了很多关于准备好的和未准备好的语句之间的速度差异的文章,它真的那么明显吗?我每秒执行大约一百次查询,所以我怀疑我会受到很大影响吗?
谢谢!
最佳答案
是的,准备好的语句肯定比这个函数更安全,而且它们还有一个额外的好处,那就是当您从数据库中取回数据时不必解码数据。顺便说一句,即使对于旧的 mysql 库,您确实应该依赖 mysql_real_escape_string
而不是您自定义的卫生功能:)
准备好的语句比未准备好的语句快得多,在典型的使用情况下,即使您“只是”每秒执行 100 次查询,您也会从中受益。
关于PHP SQL 清理 VS 准备好的语句,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10804740/