执行SQL查询时,必须清理字符串,否则用户可以在您的网站上执行恶意SQL。
我通常只有一个函数escape_string(blah),其中:
\
)替换转义符(\\
)。'
)替换单引号(\'
)。 这是否足够?我的代码中有漏洞吗?有没有一个库可以快速可靠地为我做到这一点?
我希望在Perl,Java和PHP中看到优雅的解决方案。
答案 0 :(得分:8)
为了最大限度地提高安全性,性能和正确性,请使用预准备语句。 以下是使用不同语言的大量示例(包括PHP:
)的方法https://stackoverflow.com/questions/1973/what-is-the-best-way-to-avoid-sql-injection-attacks
答案 1 :(得分:2)
我也会逃避评论(双击)
--
答案 2 :(得分:1)
在PHP中使用的一个好处是PDO。处理保护SQL(以及一般的所有SQL内容)需要花费大量的猜测。它支持预处理语句,这对于阻止SQL注入攻击有很大帮助。
本书The PHP Anthology 101 Essential Tips, Tricks & Hacks by Davey Shafik etc. 2nd Ed中包含了关于PDO的精彩入门。让学习成为一件轻而易举的事,并作为参考。除了实际的SQL查询之外,我甚至不需要考虑其他任何事情。
答案 3 :(得分:0)
使用哪种语言?看起来几乎所有这些都具有内置的SQL转义功能,可以更好地使用它。
例如,PHP有mysql_real_escape_string和addslashes。
答案 4 :(得分:0)
最好将准备好的语句与占位符一起使用。您使用的是PHP,.NET ......无论哪种方式,预处理语句都会提供更多安全性,但我可以提供样本。
答案 5 :(得分:0)
在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}';
";
这很有趣! (希望帖子能正确发送下划线,而不是_)
答案 6 :(得分:0)
使用准备/参数化查询!
答案 7 :(得分:0)
MySQL C API拥有自己的mysql_escape_string()
。使用它或它的等价物是最好的。
答案 8 :(得分:0)
使用准备好的陈述。
答案 9 :(得分:0)
在MySQL查询中,当使用LIKE时,还要确保转义“_”字符,因为它没有被mysql_real_escape_string转义。
供参考,请查看here
答案 10 :(得分:-1)
我不确定MySql是否支持参数化查询,如果是这样,你应该努力走这条路。这将确保用户输入不能做任何恶意的事情。
除了你提到的内容之外,一些“坏”字符将是分号(;)和注释( - 和/ * * /)。