为了避免SQL注入,我做了一些研究并基于this答案我开始使用MySQLi编写的statemets。这一切都很顺利,直到我根据用户点击的内容从前端发送的参数order by
和order type
。为了更具体一些,我有一些表和一些标题,用户可以安排数据考虑名称,价格,日期等,他也可以选择ASC
或DESC
。我将它存储到一些隐藏的输入类型中,所以我猜想他们可能会使用firebug
来更改它。正因为如此,我需要确保他们不能将任何东西注入到我的数据库中。PHP | MySQLi准备的语句 - 处理顺序和顺序类型参数
$stmt = $dbConnection->prepare('SELECT * FROM mytable WHERE 1 ORDER BY ? ?');
$stmt->bind_param('ss', $_GET['order_by'], $_GET['order_type']);
看来我得到一个错误。我做了一些研究,有人说没有解决方案,另一个人说唯一的解决方案是硬编码,另一个人说,我必须退出使用准备好的语句,并尝试mysql_real_escape_string
,但在我回答有人说:
如果您使用的是最新的PHP版本,下面列出的mysql_real_escape_string 选项将不再可用
所以我gueess这是不是也是这样。所以我的问题仍然存在,接下来我应该做什么?有这个问题的解决方案吗?
您只能使用参数的值,您不能用它们来替换表和列的名称。 – Barmar
'mysql_real_escape_string'不可用的原因是因为'mysql'扩展名不见了。但是如果你使用'mysqli',它有'mysqli_real_escape_string'。但这对此没有用处,因为它用于转义字符串而不是列名。 – Barmar