一种全局化mysql函数的方法,以避免sql注入

时间:2012-04-12 22:12:13

标签: php mysql sql sql-injection

请记住,我还在学习。我正在一个网站上工作,我只是调整和复制大部分代码,从现有代码,因为这是我理解它们的最简单方法。

我不断收到因使用撇号而导致的SQL错误,并且我已开始为每个文本字段添加mysql_real_escape_string(),这解决了个别问题。

现在这真的只是我寻求帮助。请不要讽刺,我真的只是想学习,这是提问的最佳地点,所以在这里:

有没有办法修复一般设置,过滤掉干扰的撇号?基本上任何有助于网站的东西都可以防止sql注入?任何帮助将不胜感激:)

3 个答案:

答案 0 :(得分:3)

一般解决方案:所有参数(值)都应通过预准备语句占位符

传递

http://nz.php.net/manual/en/pdo.prepare.php

http://nz.php.net/manual/en/mysqli.prepare.php

答案 1 :(得分:0)

  

有没有办法修复一般设置,过滤掉干扰的撇号?

绝对没有。

很久以前有一个,但现在它被诽谤,弃用和逐出教会(因为它从未按预期工作并且没有达到目的)。

您遇到的问题来自于SQL查询是程序。 因此,您必须遵循创建此程序的语法规则,就像使用任何其他程序语言一样。如果您碰巧创建了一个PHP程序,那么您也必须处理烦人的撇号 - 您不能将它全部放在随机位置的代码中,但每个都必须具有严格的语法含义,或者 - 如果是撇号作为数据的一部分 - 它必须正确转义

所以,这只是语法问题 解决问题的最佳方法是将代码与数据分开 本地准备的陈述为您提供了这种可能性 您可以创建一个程序 - 查询本身 - 并最终将一些变量绑定到它,因此,程序代码和日期分别发送到SQL服务器。
这就是为什么准备语句被认为是创建动态SQL查询的最佳方法。

但是当然你必须明确地将每个变量绑定到它的查询 - 所以,没有通用的方法。

但是,您可以使用一些助手自动进行绑定,因此,代码变得简洁

$db->run("SELECT * FROM table WHERE id=?",$id); 

既写作也短,同时又完全安全。

答案 2 :(得分:-1)

使用为您执行此操作的数据访问层是比手动保护每个查询参数更好的方法。不仅因为它很乏味,而且因为最终会忘记一个关键参数。

当我还在使用PHP时,我使用了SafeSQL - 它非常轻巧且不引人注目......但如果你是初学者则插入它可能仍然是一项艰巨的任务。