发送查询时我需要转义什么?

当你执行一个SQL查询时,你必须清理你的字符串或用户可以在你的网站上执行恶意SQL。

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

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

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

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

0
额外 编辑
意见: 1
东西必须出了错在反斜线的显示,在该行的替换转义()与双逃逸(\)。</代码>
额外 作者 bart,

10 答案

我不确定MySql是否支持参数化查询,如果是的话,你应该努力去做这个路线。这将确保用户输入无法做任何恶意的事情。

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

0
额外

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

A great primer on PDO is included in the book The PHP Anthology 101 Essential Tips, Tricks & Hacks by Davey Shafik etc. 2nd Ed. Makes learning a breeze and is excellent as a reference. I don't even have to think about anything other than the actual SQL Query anymore.

0
额外

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

https://stackoverflow.com/questions/1973/什么 - 是最最好的方式,以规避-SQL注入攻击

0
额外

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

--
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}';
    ";

That's it enjoy ! (hope the post will correctly send underscores and not _ ;)

0
额外

使用准备/参数化查询!

0
额外

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

0
额外

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

0
额外

哪种语言正在使用?似乎几乎所有的内置SQL转义函数都可以更好地使用。

例如,PHP的 mysql_real_escape_string 和< a href =“http://us2.php.net/manual/en/function.addslashes.php”rel =“nofollow noreferrer”> addslashes 。

0
额外

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

作为参考,请查看此处

0
额外