尽管没有做好准备,这个SQL语句是否可以安全地防止注入?

时间:2016-04-20 10:53:45

标签: php mysql pdo

我知道你应该准备用户有影响力的所有SQL语句,这个问题更多的是看你是否也可以有一个SQL查询,用户可以改变但你以不同的方式处理错误。

SQL注入的代码:

if(isset($_GET['delete']) && (int)$_GET['delete'] && is_numeric($_GET['delete'])){
    $query = $handler->query('SELECT * FROM portfolio WHERE id =' . $_GET['delete']);
}
else{
    echo'Error';
}

由于围绕它的if语句,SQL查询是否可以安全注入,还是仍有某种方法可以注入它?

这纯粹是为了研究,显然不在任何真实的网站上。

这是代码在准备时的样子,以表明我询问如何准备:

if(isset($_GET['delete']) && (int)$_GET['delete'] && is_numeric($_GET['delete'])){
    $query = $handler->prepare('SELECT * FROM portfolio WHERE id = :id');
    $query->execute([
        ':id' => $_GET['delete']
    ]);
}
else{
    echo'Error';
}

1 个答案:

答案 0 :(得分:1)

是的,此特定代码段是安全的。

我想知道你从这个答案得出的有用结论。

另外,回答你的一些陈述。

  

你应该准备用户有影响力的所有SQL语句,

这是与SQL注入问题相关的最糟糕的妄想之一。事实上,如果所有100%的查询都被参数化,那么您只会被认为是安全的,并且您从未打扰过一个问题“我正在处理的数据是否是用户影响的数据”

  

但你以不同的方式处理错误。

这种处理应该永远不会相互联系。如果你想验证输入参数 - 这是一个好主意。但决不是你的SQL处理代码应该取决于这种验证的结果。这只是不同的事情。在正确组织的代码中,输入参数验证永远不会与SQL处理代码位于同一文件中。而后者完全不知道验证的事实。或者对此类验证所做的任何更改(例如,它首先只允许numers,然后更改为接受任意字符串)。 SQL处理代码应该能够对提供的任何数据安全运行。