为 Select 使用可变列名时如何防止 SQL 注入

How to prevent SQL injection when using variable column name for Select

我试图阻止 SQL 在 Select 语句中注入。 当这只是关于值时(对于此处的 Like 部分),我在下面的示例中使用“bind_param”,它按预期工作。

但是,我遇到了变量列名称的问题,因为我不能为此使用 "bind_param"

有人能告诉我如何防止对变量列名称 ($language) 进行 SQL 注入(当前代码有效)吗?

我的PHP:

$language = "some language";
$location = "some location";
// ...

$stmt = $conn->prepare("SELECT tID, " . $language . " FROM Main WHERE location LIKE ? ORDER BY sortOrder, " . $language);
$stmt->bind_param("s", $location);
$stmt->execute();
// ...

您仍然可以 select 所有列,然后尝试在结果集中使用 selected 语言访问列名。如果语言不正确,你会得到一个你可以处理的异常。

更好的解决方案是规范您的数据库设计,使语言在行而不是列中。然后您可以毫无问题地使用参数化查询。