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