Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 处理PDO::prepare()添加的引号_Php_Mysql_Sql_Pdo - Fatal编程技术网

Php 处理PDO::prepare()添加的引号

Php 处理PDO::prepare()添加的引号,php,mysql,sql,pdo,Php,Mysql,Sql,Pdo,根据PHP文档PDO::prepare将引号添加到所有参数中,这样您就不必担心这样做了: 编制报表的参数不需要引用;司机会自动处理这个问题。如果应用程序专门使用预先准备好的语句,开发人员可以确保不会发生SQL注入。但是,如果查询的其他部分是使用未经转换的输入构建的,SQL注入仍然是可能的 对我来说,这个问题是我构建查询和数据库结构的方式。通常,SQL语句的FROM部分不需要参数化,因为表可能由直接用户输入定义。然而,我的代码在某些地方是这样的,因此我对参数化版本感到更舒服 SELECT * FR

根据PHP文档PDO::prepare将引号添加到所有参数中,这样您就不必担心这样做了:

编制报表的参数不需要引用;司机会自动处理这个问题。如果应用程序专门使用预先准备好的语句,开发人员可以确保不会发生SQL注入。但是,如果查询的其他部分是使用未经转换的输入构建的,SQL注入仍然是可能的

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

SELECT * FROM ? WHERE ?=?
相对于 从表格名称中选择*其中?=


所以我的问题是,有没有可能阻止我的PDO对象在from参数周围添加引号,这样我就不会遇到SQL错误了?或者我必须以不同的方式执行此操作。

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

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

@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}` = ?"

问题到底是什么?不一定要加引号。支持本机准备语句的驱动程序将保留文本?数据库服务器进行替换。-但是,您确实需要解释您的代码具体在做什么,以及为什么这是一个问题。在FROM子句中添加“?”或“:占位符”是文字字符串,而不是绑定参数。很抱歉,我在输入完问题之前意外地按了enter键可能与and重复-本质上是:no Sorry。那是不可能的。您需要一个白名单或筛选,并自己处理表/字段标识符。它们不能参数化,因为不可能进行语句准备/优化。您可以将表用作参数。在准备之前,需要通过php文本操作对其进行硬编码或就地处理。当然,如果变量内容来自受污染的源,则仅用回号包装值是不安全的。@YourCommonSense能否给我一个用例,其中表名和列名来自您无法控制的源?当他们以某种方式基于用户输入时,只给他们您的DB密码就容易多了。这意味着您可以假设它们来自可靠的来源(例如配置),或者在其他地方硬编码,或者您做了一些非常错误的事情。这仍然不能阻止你使用你的大脑:@yourcomsense是的,也许是否决投票的好理由。但我仍在等待一个用例,在这个用例中,您希望表名来自不可靠的来源?这不是关于向下投票。这个答案应该被删除,而不是被否决。