[英]How does binding values work in PDO and PHP
因此,我读了几篇关于约束力的文章,说实话,尽管我理解为真正的价值而奋斗的好处。 好处是很明显的,但是我无法理解一个真实的例子。
有人可以向我展示一个简单的查询,用户可以在其中输入值,然后在可以进行SQL注入的地方提交它,然后向我展示绑定如何避免这种情况。 那应该使它非常清楚发生了什么。
我显然是从标准MySql语句过渡到PDO的新手。
假设仅在涉及用户输入的情况下才需要它是否正确,否则我们可以跳过绑定吗?
查看我的演示文稿SQL注入神话和谬论 。
或观看有关介绍我的网络研讨会录像: http : //www.percona.com/webinars/2012-07-25-sql-injection-myths-and-fallacies (免费,但需要注册)。
我展示了几个示例,例如:
假设您有一个允许用户更改密码的页面,并且希望用户使用如下URL进行访问:
http://example.com/changepass.php?acctid=1234&pass = xyzzy
(当然,他们通常会使用POST请求,但是出于简单说明的目的,让我们使用这种GET格式。)
在该页面的脚本中,您具有以下SQL更新语句:
UPDATE Accounts
SET password = SHA2('$password')
WHERE account_id = $account_id
现在,如果恶意用户巧妙地设置了参数,就像这样:
http://example.com/changepass.php?acctid= 1234或TRUE &pass = xyzzy'),admin =('1
然后,您的SQL最终将运行以下语句:
更新帐户SET密码= SHA2(' xyzzy'),admin =('1 ')
WHERE account_id = 1234或TRUE
这将设置密码,但还会在表中设置另一列以授予用户admin特权。 WHERE子句中的注入会将更改应用到站点中的所有用户,而不仅仅是登录的用户。
参数的值为: SQL表达式中始终将一个参数视为一个值。
也就是说,即使您为该参数传递的字符串恰好包含利用注入的SQL语法,使用参数也意味着它不能被解释为单个字符串或数字值以外的任何东西。 因此,它不能终止字符串,也不能包含括号或OR
或其他会修改SQL语句的语法或语义的内容。
因此,通过使用绑定参数,它更像是这样:
更新帐户SET密码= SHA2(' xyzzy \\'),admin =(\\'1 ')
WHERE account_id =' 1234 OR TRUE '
密码看起来很有趣的地方,里面带有空格和引号,但它不会改变SQL的含义。 WHERE子句将使用该字符串的整数值,即1234。
发表您的评论:
我没有跟踪代码的每一行,但是我相信它可以使SQL语句字符串与执行每个阶段的值分开。 在某些时候,SQL被解析,然后以某种内部方式表示(不是人类可读的文本); 然后将参数值组合到其中,但是必须将其作为单个语法元素。 关键是,在解析查询之后将它们组合在一起,因此无法通过参数值更改语法。
一个例外:常规查询日志将值插值到原始SQL字符串中,以便在给定执行中记录查询及其参数。 但是不会执行此组合查询字符串。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.