发送查询时我需要逃避什么?

时间:2008-08-05 18:45:47

标签: mysql oracle security

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

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

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

这是否足够?我的代码中有漏洞吗?有没有一个库可以快速可靠地为我做到这一点?

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

11 个答案:

答案 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)

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

供参考,请查看here

答案 4 :(得分:0)

使用哪种语言?看起来几乎所有这些都具有内置的SQL转义功能,可以更好地使用它。

例如,PHP有mysql_real_escape_stringaddslashes

答案 5 :(得分:0)

最好将准备好的语句与占位符一起使用。您使用的是PHP,.NET ......无论哪种方式,预处理语句都会提供更多安全性,但我可以提供样本。

答案 6 :(得分:0)

使用准备好的陈述。

答案 7 :(得分:0)

MySQL C API拥有自己的mysql_escape_string()。使用它或它的等价物是最好的。

答案 8 :(得分: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}';
    ";

这很有趣! (希望帖子能正确发送下划线,而不是_)

答案 9 :(得分:0)

使用准备/参数化查询!

答案 10 :(得分:-1)

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

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