发送查询时我需要转义什么?
执行SQL查询时,我们必须清理字符串,否则用户可以在网站上执行恶意SQL。
我通常只有一个函数escape_string(blah),该函数:
- 将转义符(
\
)替换为双转义符(\\
)。 - 用转义的单引号(
\'
)替换单引号('
)。
这样够吗?我的代码中有漏洞吗?是否有图书馆可以为我快速可靠地做到这一点?
我想在Perl,Java和PHP中看到优美的解决方案。
解决方案
回答
使用哪种语言?似乎它们中的大多数都具有内置的SQL转义函数,这些函数会更好地使用。
例如,PHP具有mysql_real_escape_string和加号。
回答
我也会避开评论(双破折号)
--
回答
我们最好使用带占位符的预备语句。我们是否正在使用PHP,.NET ...无论哪种方式,准备好的语句将提供更高的安全性,但我可以提供示例。
回答
我不确定MySql是否支持参数化查询,如果支持,则应尽一切努力。这将确保用户输入不会做任何恶意的事情。
否则,除了我们提到的内容外,一些"坏"字符还包括分号(;)和注释(-和/ * * /)。
回答
在PHP中,我正在使用这一代码,对此我将不胜感激:
function quote_smart($valeur) { if (get_magic_quotes_gpc()) $valeur = stripslashes($valeur); if (!is_numeric($valeur)) $valeur = mysql_real_escape_string($valeur); return $valeur; } $IdS = quote_smart($_POST['theID']); $sql = " SELECT * FROM Students WHERE IdStudent={$IdS}; ";
如果字段可以为NULL,则需要再次验证:
$picture = NULL; $theidyouwant = 7; $Name = 'WOOD'; if(is_null($picture)) $p = 'NULL'; else $p = "'".quote_smart($picture)."'"; $IdS = quote_smart($theidyouwant); $requete = "SELECT * FROM Students WHERE IdStudent={$IdS} AND PictureStudent={$p} AND NameStudent='{$Name}'; ";
就是这样享受!
(希望该帖子将正确发送下划线,而不是_)
回答
在PHP中使用的一个很棒的东西是PDO。在处理保护SQL(以及一般而言所有SQL东西)时,需要花费大量的猜测。它支持准备好的语句,这对于阻止SQL注入攻击大有帮助。
Davey Shafik等人撰写的《 PHP Anthology 101基本技巧,窍门与技巧》一书中包含了PDO的入门知识。第二版。使学习变得轻而易举,并且非常适合作为参考。除了实际的SQL查询外,我什至不必考虑其他任何事情。
回答
为了获得最大的安全性,性能和正确性,请使用准备好的语句。
以下是使用多种不同语言(包括PHP)的示例来完成此操作的方法:
https://stackoverflow.com/questions/1973/what-is-the-best-way-to-avoid-sql-injection-attacks
回答
使用准备好的/参数化的查询!
回答
MySQL C API具有自己的" mysql_escape_string()"。最好使用它或者等效的方法。
回答
使用准备好的语句。
回答
在MySQL查询中,使用LIKE时,还请确保转义" _"字符,因为mysql_real_escape_string不会转义该字符。
供参考,请在这里检查