2011-06-16 82 views
3

我有一堆perl CGI需要参数并在各种DBI mySql查询中使用它们的值。保护免受恶意的sql注入

如果我不允许任何用户提交的值包含单词select,insert,delete或update作为参数,那么恶意用户是否可以从我的系统中伤害(或窃取数据)?并且只要我用单引号包装所有varchar用户提供的值?

我意识到这个问题与其他人非常相似,但其他人似乎都指出了各种PHP解决方案,并且我没有使用PHP,所以请原谅冗余,或者指出一个相关的问题:回答这个具体问题。

回答

12

在Perl中处理此问题的正确方法是在所有SQL查询中使用placeholders。通过DBI占位符传递用户提供的数据将确保正确引用所有内容。 (这并不能保证它是安全,当然,但它会阻止SQL注入。)

+5

Nitpicky,我知道,但占位符_ *不会传递值。 SQL命令的结构和要绑定到占位符的数据分别发送到数据库,这样就不需要引用了。唯一的时间占位符将引用数据是当DBI必须伪造它们,因为它处理了一些不支持真实事物的讨价还价基础数据库后端。 – 2011-06-17 08:27:44

+0

谢谢...我会进一步调查 – 2011-06-17 19:37:12

4

使用参数化查询。那么用户输入根本不是命令的一部分,这是了解命令的唯一可靠方法,不会被修改。

+0

我不确定你的意思是什么。什么是参数化查询?例如,当情况是用户向我提供关于他们自己的信息时,我需要将用户输入作为命令的一部分。他们的名字可能是“杰克”,或者可能是“从table_a删除”。目前,我只是在发送这些恶意字符串之前对其进行测试,您的回答是否解决了这种情况? – 2011-06-17 19:35:53

+0

这是与上面的friedo回复中的“占位符”相同概念的另一个名称。关键的想法是SQL引擎应该在用户输入被污染之前解释你的SQL命令*。 – catfood 2012-01-17 15:47:23