gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 11:35:04 25 4
gpt4 key购买 nike

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

可 SQL 注入(inject)的代码:

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

由于 SQL 查询周围有 if 语句,SQL 查询是否可以安全地避免注入(inject),或者是否仍然有某种注入(inject)方式?

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

这就是代码准备好后的样子,只是为了表明我没有询问如何准备:

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';
}

最佳答案

是的,这个特定的代码片段是安全的。

我想知道您可以从这个答案中得出什么有用的结论。

另外,回答一下你的一些说法。

you are supposed to prepare all SQL statements where the user has influence over,

这是与 SQL 注入(inject)问题相关的最严重的错觉之一。事实上,只有所有 100% 的查询都被参数化时,您才被认为是安全的,并且您永远不会为“我正在处理的数据是否是用户可以影响的数据”这样的问题而烦恼。 .

but you handle the errors differently.

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

关于php - 尽管没有准备好,这个 SQL 语句是否可以安全地防止注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36741576/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com