PHP:调整SELECT for SQL注入预防后循环不起作用

Tan*_*uta 1 php mysql select associative-array sql-injection

我试图以防止SQL注入(标准网站)的方式为MySQL设置PHP查询.

我有几个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();
Run Code Online (Sandbox Code Playgroud)

旧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();
Run Code Online (Sandbox Code Playgroud)

错误信息:

致命错误:在第21行的/homepages/21/d580042014/htdocs/myform.php中调用非对象上的成员函数fetch_assoc()

提前谢谢了.

Jay*_*ard 5

您不能绑定列名和表名,只能绑定数据.您需要指定表,然后为您的绑定'%calendar weekday%'.

$stmt = $conn->prepare("SELECT " . $selectLang . " FROM `TranslationsMain` WHERE `location` LIKE ? ORDER BY `sortOrder`, " . $selectedLang);
$stmt->bind_param('s', $calendar_weekday);
Run Code Online (Sandbox Code Playgroud)

如果要使用动态表/列名称,则应执行这些项目的最小白名单.您可以通过询问数据库哪些列对给定数据库表有效来构建动态白名单.例如:

SELECT `COLUMN_NAME` 
FROM `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE `TABLE_SCHEMA` = `database_name`
AND `TABLE_NAME` = `table_name`
Run Code Online (Sandbox Code Playgroud)

您可以将所有这些信息放在数组中,然后检查以确保查询中使用的表/列名称在数组中.应该对表名和列名进行额外考虑,确保没有键/保留字用于这些名称.

最后,在调用动态查询的值时,在验证的表/列名称周围使用反引号.这将涵盖对键/保留字列表的任何可能的更改,并提供额外的保护层.