21

当您执行 SQL 查询时,您必须清理您的字符串,否则用户可能会在您的网站上执行恶意 SQL。

我通常只有一个函数 escape_string(blah),它:

  • \用双转义符( ) 替换转义符 ( \\)。
  • '用转义的单引号 ( )替换单引号 ( \')。

这足够吗?我的代码有漏洞吗?有没有一个图书馆可以为我快速可靠地做到这一点?

我希望看到 Perl、Java 和 PHP 中的优雅解决方案。

4

11 回答 11

8

为了获得最大的安全性、性能和正确性,请使用准备好的语句。以下是使用不同语言(包括 PHP)的大量示例来执行此操作的方法:

https://stackoverflow.com/questions/1973/what-is-the-best-way-to-avoid-sql-injection-attacks

于 2008-08-05T19:38:51.023 回答
2

我也会逃避评论(双破折号)

--
于 2008-08-05T18:46:45.683 回答
1

在 PHP 中使用的一个很棒的东西是PDO。处理保护您的 SQL(以及所有一般的 SQL 内容)需要大量的猜测。它支持准备好的语句,这对阻止 SQL 注入攻击大有帮助。

Davey Shafik 等人所著的 The PHP Anthology 101 Essential Tips, Tricks & Hacks 等书第 2 版中包含了关于 PDO 的精彩入门。让学习变得轻而易举,非常适合作为参考。除了实际的 SQL 查询之外,我什至不必再考虑其他任何事情。

于 2008-08-05T19:28:29.703 回答
0

您使用的是哪种语言?似乎它们几乎都有内置的 SQL 转义函数,使用起来会更好。

例如,PHP 有mysql_real_escape_stringaddlashes

于 2008-08-05T18:46:41.347 回答
0

你最好使用带有占位符的准备好的语句。您是否使用 PHP、.NET...无论哪种方式,准备好的语句都会提供更高的安全性,但我可以提供一个示例。

于 2008-08-05T18:48:23.497 回答
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}';
    ";

这就是享受!(希望帖子能正确发送下划线而不是 _ ;)

于 2008-08-05T19:21:49.090 回答
0

使用准备好的/参数化的查询!

于 2008-08-05T19:55:12.613 回答
0

MySQL C API 有它自己的mysql_escape_string(). 最好使用它或等效的。

于 2008-08-14T17:59:02.597 回答
0

使用准备好的语句。

于 2008-09-16T21:14:00.753 回答
0

在 MySQL 查询中,使用 LIKE 时,还要确保将“_”字符转义,因为它不会被 mysql_real_escape_string 转义。

供参考,请在此处查看

于 2008-10-14T04:57:04.980 回答
-1

我不确定 MySQL 是否支持参数化查询,如果支持,你应该努力走这条路。这将确保用户输入不会做任何恶意的事情。

否则,除了您提到的内容之外,一些“坏”字符将是分号 (;) 和注释(- 和 /* */)。

于 2008-08-05T18:49:58.360 回答