我知道你应该准备用户有影响力的所有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';
}
答案 0 :(得分:1)
是的,此特定代码段是安全的。
我想知道你从这个答案得出的有用结论。
另外,回答你的一些陈述。
你应该准备用户有影响力的所有SQL语句,
这是与SQL注入问题相关的最糟糕的妄想之一。事实上,如果所有100%的查询都被参数化,那么您只会被认为是安全的,并且您从未打扰过一个问题“我正在处理的数据是否是用户影响的数据”
但你以不同的方式处理错误。
这种处理应该永远不会相互联系。如果你想验证输入参数 - 这是一个好主意。但决不是你的SQL处理代码应该取决于这种验证的结果。这只是不同的事情。在正确组织的代码中,输入参数验证永远不会与SQL处理代码位于同一文件中。而后者完全不知道验证的事实。或者对此类验证所做的任何更改(例如,它首先只允许numers,然后更改为接受任意字符串)。 SQL处理代码应该能够对提供的任何数据安全运行。