修复此特定 SQL 注入漏洞的示例代码


Sample code to fix this particular SQL-injection hole

请先完整阅读

在这个答案中: 如何防止使用动态表名进行 SQL 注入?

Pekka指出了为什么这段代码:

$clas=$_POST['clas'];
$query="SELECT * FROM $clas ";

无法使用 PDO 或 mysql-real_escape_string() 进行修复。

任何人都可以提供示例代码如何解决此问题,以便新手可以粘贴该代码
(之后/根据他的需要进行调整)并且不受SQL注入的影响。

请不要解释SQL注入,我对注入和PDO了如指掌,我只需要示例代码

您可以使用白名单来确保该值确实是您希望以这种方式访问的表之一。

例:

$allowed_tables = array('table1', 'table2');
$clas = $_POST['clas'];
if (in_array($clas, $allowed_tables)) {
    $query = "SELECT * FROM `$clas`";
}

请注意,直接从 GET 或 POST 参数构造 SQL 查询通常是一个坏主意,但白名单可以使其安全。

您可以使用for转义:P

$clas = str_replace('`','''`',$_POST['clas']);
$query = "SELECT * FROM '`{$clas}'`";

所以,是一个非常糟糕的主意。

做不同的事情。