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

Translate

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

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

  • 替换转义符(\)两次转义(\\).
  • 替换单引号(')的转义单引号(\')。

这样够吗?我的代码中有漏洞吗?是否有图书馆可以为我快速可靠地做到这一点?

我想在Perl,Java和PHP中看到优美的解决方案。

This question and all comments follow the "Attribution Required."

所有的回答

Translate

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

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

来源
Translate

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

--
来源
Translate

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

书中包含有关PDO的出色入门PHP Anthology 101基本技巧,诀窍和技巧,作者Davey Shafik等。第二版。使学习变得轻而易举,并且非常适合作为参考。除了实际的SQL查询外,我什至不必考虑其他任何事情。

来源
Translate

使用哪种语言?似乎它们中的大多数都具有内置的SQL转义函数,这些函数会更好地使用。

例如,PHP具有mysql_real_escape_string斜线.

来源
Translate

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

来源
Translate

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

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

来源
Translate

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

来源
King Lee
Translate

使用准备好的语句。

来源
Translate

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

供参考,请检查这里

来源
BCS
Translate

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

来源
Bob
Translate

我不确定MySql是否支持参数化查询,如果支持,则应尽一切努力。这将确保用户输入不会做任何恶意的事情。

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

来源
上一个问题:
git -版本控制入门