2012-01-16 94 views
7

按照PHP文档PDO ::准备()增加了引号,所有的参数,使您不必担心这样做:与PDO加引号处理::准备()

“准备语句的参数不需要被引用;驱动程序自动处理这个,如果应用程序独占使用预准备语句,开发人员可以确保不会发生SQL注入(但是,如果查询的其他部分正在建立与未转义的输入,SQL注入仍然是可能的)。“

对我来说这个问题是我构建查询和数据库结构的方式。通常,SQL语句的FROM部分不需要参数化,因为Table可能会由直接用户输入定义。然而,我的代码在某些地方是这种情况,因此我对参数化版本感到更加舒适。

而不是 SELECT * FROM tablename WHERE?=?

所以我的问题是这样的,是可以防止我的PDO对象从周围加入了FROM参数,以便我没有得到我的脸上泛起SQL错误,引号?或者我必须以不同的方式做到这一点。

+2

究竟是什么问题? – jeroen 2012-01-16 18:01:10

+0

它不一定会加引号。支持本机预处理语句的驱动程序将保留文字'?',数据库服务器执行替换。 - 但是你需要解释你的代码在做什么以及为什么这里有问题。在FROM子句中添加“?”或“:placeholder”是字面字符串,不是绑定参数。 – mario 2012-01-16 18:03:12

+0

对不起,我不小心撞到进入之前我打完的表名称中使用PDO/MySQL的准备语句作为参数]问题 – hamalnamal 2012-01-16 18:04:33

回答

4

准备语句中的占位符仅用于数值。插入动态表名的唯一方法就是自己做

"SELECT FROM `".$table."` WHERE `".$column."` = ?" 
+3

当然,如果变量内容来自一个受污染的源,那么仅仅用back ticks包装这个值是不安全的。 – Matthew 2012-01-16 18:14:40

+0

@YourCommonSense您能否给我一个用例,其中_table_和_column_名称来自您的控制之外的来源?当他们_somehow_基于用户输入时,只要给他们你的DB密码就容易多了。这就是说,你可以假设他们来自可靠的来源(例如配置或其他地方的硬编码),或者你做了一些非常错误的事情。它仍然不会阻止你使用你的大脑:) – KingCrunch 2014-03-03 03:01:28

+0

便宜的谈话,老兄。 – 2014-03-03 04:29:50

2

@KingCrunch是他的回答大多是正确的。你应该真的逃避自己的字符串。像这样的东西应该可以防止大部分的喷射:

//make sure $table and $column only contain alphanumeric chars 
$table = preg_replace("/[^A-Za-z0-9]/", '', $table); 
$column = preg_replace("/[^A-Za-z0-9]/", '', $column); 

$query = "SELECT FROM `{$table}` WHERE `{$column}` = ?"