我想知道我的代码是否是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
已从不受信任的输入更改为经过验证的表名。 因此,将来任何使用您的代码的人都可能会认为
- 您在这里遇到需要修复的问题,或者
- 将变量内插到 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中做到这一点,很容易适应它。希望有帮助。