何时*不*使用预准备语句?

2022-08-30 13:36:41

我正在重新设计一个PHP驱动的网站,它使用最小的数据库。原始版本使用“伪预准备语句”(执行引用和参数替换的PHP函数)来防止注入攻击并将数据库逻辑与页面逻辑分开。

用一个使用PDO和真正准备好的语句的对象替换这些临时函数似乎是很自然的,但是在阅读了它们之后,我不太确定。PDO似乎仍然是一个好主意,但准备语句的主要卖点之一是能够重用它们......我永远不会。这是我的设置:

  • 这些语句都非常简单。大多数都是以形式 。拍品中最复杂的陈述只是三个这样的选择与s连接在一起。SELECT foo,bar FROM baz WHERE quux = ? ORDER BY bar LIMIT 1UNION ALL
  • 每个页面命中最多执行一个语句,并且只执行一次。
  • 我处于托管环境中,因此对亲自进行任何“压力测试”来抨击他们的服务器持谨慎态度。

鉴于使用预准备语句至少会使我进行的数据库往返次数增加一倍,我是否最好避免使用它们?我是否可以避免多个数据库跳闸的开销,同时保留参数化和注入防御的好处?或者,与执行非预准备查询相比,预准备语句 API 使用的二进制调用是否表现得足够好,我不必担心它?PDO::MYSQL_ATTR_DIRECT_QUERY

编辑:

谢谢你所有的好建议,伙计们。我希望我能将多个答案标记为“被接受”——许多不同的观点。不过,最终,我必须给瑞克他应得的...如果没有他的回答,即使听从每个人的建议,我也会幸福地离开并做完全错误的事情。:-)

模仿准备好的陈述吧!


答案 1

今天的软件工程规则:如果它不会为你做任何事情,就不要使用它。


答案 2

我想你想要PDO::ATTR_EMULATE_PREPARES。这将关闭本机数据库预准备语句,但仍允许查询绑定以防止 sql 注入并保持 sql 整洁。据我所知,PDO::MYSQL_ATTR_DIRECT_QUERY完全关闭查询绑定。


推荐