当你执行SQL query,你必须干净你的串或用户可以执行恶意SQL在你的网站上。

我通常只是有一个功能escape_string(等等),其中:

  • 替换逃脱(\)与双逃脱(\\).
  • 替换单一的报价(')与一个逃脱了单一的报价(\').

这是否充分?有孔在我的代码?是否有一个图书馆,它可以这样做,迅速和可靠地为我?

我想看到优雅的解决方案在Perl、Java和PHP.

有帮助吗?

解决方案

最大的安全性、性能和正确使用准备好的发言。这里是如何做到这有很多的例子,在不同的语言,包括PHP:

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

其他提示

我也逃脱的意见(双划)

--

一个伟大的事情使用在PHP是的 公设辩护人.它需要很多的猜测出的处理与保护SQL(和所有SQL的东西在一般)。它支持准备好的发言,这大大挫败SQL注射攻击。

一个伟大的底在公设辩护人包括在本书 PHP文集101必要的技巧、技巧和黑客的戴维沙菲等等。2nd Ed.使得学习的一件轻而易举的事,优异作为参考。我甚至都不认为有关的任何其他实际SQL Query了。

其语言使用的?这似乎是几乎所有的它们已经建立SQL逃离职能,将更好地使用。

例如,PHP有 mysql_real_escape_stringaddslashes.

你最好使用准备好的发言占位符。您使用的是PHP.净...不管怎样,准备好的发言将提供更多的安全,但我可以提供一个样本。

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

这就是它!(希望该职位将发送正确强调和不_;)

使用准备/参数查询的!

使用准备好的发言。

在MySQL查询,当使用等,也确保逃脱"_"字,因为它不是逃mysql_real_escape_string.

对于参考,检查 在这里,

MySQL C API都有它自己的 mysql_escape_string().使用它或它的当量将是最好的。

我不知道如果MySql支持参数化的查询,如果是这样,你应该做出努力走这路线。这将确保用户输入不可能做什么恶意的。

另有一些"坏"字除了你提到的将是分号(;)和意见(--和/**/).

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top