PHP SQL 注入是安全的


PHP SQL Injection is it safe?

我想知道我的代码是否是100%安全的agasint SQL注入,它看起来像这样:

$table = $_GET['table'];
switch ($table) {
case 'data':
    $sql = "select * from $table";
    break;
case 'anothertable':
    $sql = "select * from $table";
    break; 
}
$con = new mysqli($hostname,$username,$password,$db_name);
$result = $con->query($sql);

如果$table与开关不匹配,则根本没有设置$sql...

否则,通过将可接受的表名列入白名单,您避免了通过$table注入不良内容的风险。

我要说的一点是,必须仔细阅读才能看到$table已从不受信任的输入更改为经过验证的表名。 因此,将来任何使用您的代码的人都可能会认为

  1. 您在这里遇到需要修复的问题,或者
  2. 将变量内插到 SQL 查询中通常是可以接受的。

因此,可能值得特意在评论中解释您在做什么,以及(更重要的是)为什么。

在您的位置上,我会避免基于用户输入进行这种动态查询,因为它闻起来有糟糕的应用程序设计,

但是在SQL注入方面,你的代码是安全的,因为它正确地实现了唯一正确的策略 - 白名单。

你的代码不安全。下面是如何使用MySQL(PDO)使其安全的示例。我在PDO中这样做,因为这是我经常使用的,而不是mysqli:)

$table = $_GET['table'];
$valid_command = FALSE;//value becomes true if you find your
//value in the following if conditional
if (($table==='table')||($table==='anothertable'))
{
  $valid_command = TRUE;
}
if ($valid_command)
{
  $sql = "SELECT * FROM table";
  $sqlPrepared = $conn->prepare($sql);
  $sqlPrepared->bindParam(':table', $table);
  $sqlPrepared->execute();
}

如果你想在mysqli中做到这一点,很容易适应它。希望有帮助。