当前位置: 首页 > 面试题库 >

PHP PDO准备好的语句是否需要转义?

窦哲彦
2023-03-14
问题内容

在PDO :: Prepare页上指出:

“并且通过消除对参数的手动引用来帮助防止SQL注入攻击

知道这一点,是否有一个像mysql_real_escape_string()这样的PHP函数可以照顾到PDO的转义?还是PDO会为我做好一切转义?

编辑

我现在意识到我问了一个错误的问题。我的问题确实是,“ PDO会为我做什么?”
我现在通过这些答案意识到,它实际上仅消除了对引号进行转义的需要。但是我仍然需要对传递给execute函数的值进行任何其他PHP清理调用。例如htmlentities(),strip_tags()…等…


问题答案:

PDO不会转义变量。变量和SQL命令通过MySQL连接独立传输。和 SQL标记生成器(分析器)从未着眼于价值
。仅将值逐字复制到数据库存储中,而不会造成任何损害。这就是为什么无需将数据与准备好的语句编组在一起的原因。

请注意,这主要是速度优势。使用mysql_real_escape_string(),您首先需要在PHP中编组变量,然后将效率低下的SQL命令发送到服务器,这将导致昂贵的实际SQL命令与值的隔离。这就是为什么经常说安全优势只是隐式的,而不是使用PDO的主要原因。

如果您使用SQL命令并没有实际使用准备好的语句(不好!),那么可以,PDO仍然有一个转义函数:$ pdo-> quote($
string)



 类似资料:
  • 问题内容: 对于此查询,有必要使用吗? 任何改进或查询是否还好? 在这种情况下,查询速度很重要。 问题答案: 否,准备好的查询(正确使用时)将确保对数据进行正确的转义以进行安全查询。您有点正确地使用它们,只需要更改一件事。因为您使用的是“?” 占位符,最好通过execute方法传递参数。 请注意,如果要将其输出到页面,数据库清理并不意味着可以在HTML中安全显示,因此也可以在其上运行htmlspe

  • 使用PHP和MySQLi,我有一个简单的表单,其中包含4个HTML 5下拉列表输入。现在想知道我是否仍然必须使用Prepared语句来保护我的数据库?我是否仍有SQL注入问题的风险?或者使用此类输入是否存在任何其他类型的风险。谢谢

  • 我正在为我的sqlite日志数据库使用准备好的语句。 我的线程每50ms运行一次,将日志缓冲区中的内容写入数据库。 目前,我正在对每个线程运行一个新的准备好的语句批处理,并在所有数据线写入后关闭它们。 现在我想知道是否最好将准备好的语句保存在内存中,并仅在线程关闭/中断时关闭它? 我之所以进行这种预优化,是因为我希望这个日志线程对主应用程序性能的干扰尽可能小,我可以想象每50秒分配/解析/验证资源

  • 我有以下准备的一个准备好的声明失败了... 我在我的第一份准备好的声明中几乎有同样的准备,而且它进行得很好。我不确定是否我有两个准备好的声明,如果这是造成一个问题,或情况可能是什么? 现在我有个错误... 更新-可能的内部连接,像这样?

  • 问题内容: 如果我使用MySQLi准备的语句,如下所示: 我是否仍然需要像下面这样对变量进行转义: 问题答案: 不,如果您在应用程序中的任何地方都使用准备好的语句,那么可以避免SQL注入。但是,一个重要的“陷阱”是二阶注入攻击,当某些查询使用准备好的语句而其他不使用准备好的语句时,就会发生这种攻击。 根据这个答案在SO类似的问题: 准备好的语句/参数化查询足以防止对该语句进行一阶注入。如果在应用程