1
194
不能用PDO中的参数替换表名和列名。
在这种情况下,您只需要手动筛选和清理数据。实现这一点的一种方法是将速记参数传递给将动态执行查询的函数,然后使用
通过不保留默认大小写或使用返回错误消息的默认大小写,可以确保只使用希望使用的值。 |
2
130
理解 为什么? 绑定表(或列)名称不起作用,您必须了解准备好的语句中的占位符是如何工作的:它们不能简单地替换为(适当转义的)字符串,并执行结果SQL。相反,一个被要求“准备”语句的DBMS会为它将如何执行该查询提出一个完整的查询计划,包括它将使用哪些表和索引,不管您如何填充占位符,这些表和索引都是相同的。
计划
这也不是一个抽象库(如PDO)可以或应该解决的问题,因为它会破坏准备好的语句的两个关键目的:1)允许数据库提前决定查询的运行方式,并多次使用相同的计划;2)通过将查询逻辑与variab分离来防止安全问题。LE输入。 |
3
12
我看到这是一篇老文章,但我发现它很有用,我想我会分享一个类似于@kzqai建议的解决方案: 我有一个函数接收两个参数,比如…
在内部,我对照我设置的数组进行检查,以确保只有具有“有福”表的表和列可以访问:
然后运行pdo之前的php检查看起来像…
|
4
4
使用前者本质上并不比后者更安全,您需要清理输入,不管它是参数数组的一部分还是简单变量。所以我不认为使用后一个表单有什么问题
|
5
2
(迟些回答,查阅我的旁注)。 当试图创建“数据库”时,同样的规则也适用。 不能使用准备好的语句绑定数据库。 即。:
不会起作用。改用安全列表。 边注: 我添加了这个答案(作为社区wiki),因为它通常用于结束问题,有些人在尝试绑定 数据库 而不是表和/或列。 |
6
0
我的一部分人想知道你是否可以提供你自己的自定义消毒功能,就像这样简单:
我还没有仔细考虑过,但是除了字符和下划线之外,删除任何内容都可能有效。 |
7
0
对于这个线程中的主要问题,其他的文章明确说明了为什么在准备语句时不能将值绑定到列名,所以这里有一个解决方案:
上面只是一个例子,所以不用说,复制粘贴是行不通的。根据需要进行调整。 现在,这可能不提供100%的安全性,但它允许在列名称作为动态字符串“进入”时对它们进行一些控制,并且可以在用户端进行更改。此外,不需要用表列名和类型构建一些数组,因为它们是从信息_模式中提取的。 |
Jacco · 未能格式化我的日期以在php中正确工作 1 年前 |
jay ram · 如何在URL核心php中从API获取JSON? 1 年前 |
Ishwarya A · php电子表格在浏览器中显示多张excel 1 年前 |