题
当你执行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_string 和 addslashes.
你最好使用准备好的发言占位符。您使用的是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支持参数化的查询,如果是这样,你应该做出努力走这路线。这将确保用户输入不可能做什么恶意的。
另有一些"坏"字除了你提到的将是分号(;)和意见(--和/**/).