为 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 语言访问列名。如果语言不正确,你会得到一个你可以处理的异常。
更好的解决方案是规范您的数据库设计,使语言在行而不是列中。然后您可以毫无问题地使用参数化查询。
我试图阻止 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 语言访问列名。如果语言不正确,你会得到一个你可以处理的异常。
更好的解决方案是规范您的数据库设计,使语言在行而不是列中。然后您可以毫无问题地使用参数化查询。