PHP:为 SQL 注入预防调整 SELECT 后,While 循环不起作用
PHP: While loop not working after adjusting SELECT for SQL injection prevention
我正在尝试为 MySQL 设置 PHP 查询以防止 SQL 注入(标准网站)。
我有几个 INSERT 查询,在这些查询中更改它效果很好,但是 在接下来的 SELECT 自更新 以来我一直收到错误,看起来像 while循环不适用于我所做的更改(它在不使用旧代码中的语句的情况下运行良好)。
谁能告诉我我做错了什么?
新建 PHP:
$stmt = $conn->prepare("SELECT ? FROM TranslationsMain WHERE location LIKE '%calendar weekday%' ORDER BY sortOrder, ?");
$stmt->bind_param('s', $selectedLang);
$stmt->execute();
$result = $stmt->get_result();
while($arrCalWeekdays = $result->fetch_assoc()){
$calWeekdays[] = $arrCalWeekdays;
}
$conn->close();
旧PHP(更改部分):
$sql = "SELECT " . $selectedLang . " FROM TranslationsMain WHERE location LIKE '%calendar weekday%' ORDER BY sortOrder, " . $selectedLang;
$result = $conn->query($sql);
while($arrCalWeekdays = $result->fetch_assoc()){
$calWeekdays[] = $arrCalWeekdays;
}
$conn->close();
错误信息:
Fatal error: Call to a member function fetch_assoc() on a non-object in /homepages/21/d580042014/htdocs/myform.php on line 21
非常感谢。
您不能绑定列和 table 名称,只能绑定数据。您需要指定 table 然后绑定您的 '%calendar weekday%'
.
$stmt = $conn->prepare("SELECT " . $selectLang . " FROM `TranslationsMain` WHERE `location` LIKE ? ORDER BY `sortOrder`, " . $selectedLang);
$stmt->bind_param('s', $calendar_weekday);
如果您想使用动态 table / 列名称,您应该对这些项目执行最少的白名单。您可以通过询问数据库哪些列对给定数据库有效 table 来构建动态白名单。例如:
SELECT `COLUMN_NAME`
FROM `INFORMATION_SCHEMA`.`COLUMNS`
WHERE `TABLE_SCHEMA` = `database_name`
AND `TABLE_NAME` = `table_name`
您可以将所有这些信息放在数组中,然后检查以确保查询中使用的 table / 列名称在数组中。应额外考虑 table 和列名,确保没有关键字/保留字用于这些名称。
最后,在调用动态查询的值时,在经过验证的 table / 列名称周围使用反引号。这将涵盖对键/保留字列表的任何潜在更改,并提供额外的保护层。
我正在尝试为 MySQL 设置 PHP 查询以防止 SQL 注入(标准网站)。
我有几个 INSERT 查询,在这些查询中更改它效果很好,但是 在接下来的 SELECT 自更新 以来我一直收到错误,看起来像 while循环不适用于我所做的更改(它在不使用旧代码中的语句的情况下运行良好)。
谁能告诉我我做错了什么?
新建 PHP:
$stmt = $conn->prepare("SELECT ? FROM TranslationsMain WHERE location LIKE '%calendar weekday%' ORDER BY sortOrder, ?");
$stmt->bind_param('s', $selectedLang);
$stmt->execute();
$result = $stmt->get_result();
while($arrCalWeekdays = $result->fetch_assoc()){
$calWeekdays[] = $arrCalWeekdays;
}
$conn->close();
旧PHP(更改部分):
$sql = "SELECT " . $selectedLang . " FROM TranslationsMain WHERE location LIKE '%calendar weekday%' ORDER BY sortOrder, " . $selectedLang;
$result = $conn->query($sql);
while($arrCalWeekdays = $result->fetch_assoc()){
$calWeekdays[] = $arrCalWeekdays;
}
$conn->close();
错误信息:
Fatal error: Call to a member function fetch_assoc() on a non-object in /homepages/21/d580042014/htdocs/myform.php on line 21
非常感谢。
您不能绑定列和 table 名称,只能绑定数据。您需要指定 table 然后绑定您的 '%calendar weekday%'
.
$stmt = $conn->prepare("SELECT " . $selectLang . " FROM `TranslationsMain` WHERE `location` LIKE ? ORDER BY `sortOrder`, " . $selectedLang);
$stmt->bind_param('s', $calendar_weekday);
如果您想使用动态 table / 列名称,您应该对这些项目执行最少的白名单。您可以通过询问数据库哪些列对给定数据库有效 table 来构建动态白名单。例如:
SELECT `COLUMN_NAME`
FROM `INFORMATION_SCHEMA`.`COLUMNS`
WHERE `TABLE_SCHEMA` = `database_name`
AND `TABLE_NAME` = `table_name`
您可以将所有这些信息放在数组中,然后检查以确保查询中使用的 table / 列名称在数组中。应额外考虑 table 和列名,确保没有关键字/保留字用于这些名称。
最后,在调用动态查询的值时,在经过验证的 table / 列名称周围使用反引号。这将涵盖对键/保留字列表的任何潜在更改,并提供额外的保护层。