在SQL语句中安全使用用户指定的顺序的推荐方法


recommended way to safely use a user specificed order by in a SQL statement

是否可以按sql语句的部分顺序绑定Param。例如,以下可能吗?

select whatever from table where age > :age order by :user_specified_order_by_field_name_here  

如果没有,建议如何确保user_specified_order_by_field_name_here不包含SQL注入代码?

否,PDO不支持将动态表或列名作为准备值。插入到查询中的任何列名都不会被转义,这将导致SQL注入漏洞。

PDO::Quote()也没有帮助——它只能转义字符串,但在mySQL中,列名不是字符串。

防止出现问题的唯一100%安全的方法是将user_specified_order_by_field_name_here与表中的有效列列表进行比较。您甚至可以使用数字(在内部解析为列名)来添加额外的模糊层。