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

时间:2020-03-05 18:37:49  来源:igfitidea点击:

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

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

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

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

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

解决方案

回答

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

例如,PHP具有mysql_real_escape_string和加号。

回答

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

--

回答

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

回答

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

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

回答

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

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

回答

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

Davey Shafik等人撰写的《 PHP Anthology 101基本技巧,窍门与技巧》一书中包含了PDO的入门知识。第二版。使学习变得轻而易举,并且非常适合作为参考。除了实际的SQL查询外,我什至不必考虑其他任何事情。

回答

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

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

回答

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

回答

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

回答

使用准备好的语句。

回答

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

供参考,请在这里检查