如果我使用下拉列表,是否必须防止 SQL 注入?

2022-08-30 07:38:52

我知道你永远不应该信任来自表单的用户输入,主要是因为SQL注入的机会。

但是,这是否也适用于唯一输入来自下拉列表的表单(见下文)?

我正在将 保存到会话中,然后在整个站点中使用该会话来查询各种数据库(使用Select查询),任何SQL注入肯定会损害(可能丢弃)它们。$_POST['size']mysqli

没有用于查询数据库的类型化用户输入的区域,只有下拉列表。

<form action="welcome.php" method="post">
<select name="size">
  <option value="All">Select Size</option> 
  <option value="Large">Large</option>
  <option value="Medium">Medium</option>
  <option value="Small">Small</option>
</select>
<input type="submit">
</form>

答案 1

是的,您需要防止这种情况。

让我告诉你为什么,使用Firefox的开发者控制台:

i've edited one of the values in the dropdown to be a drop table statement

如果不清理此数据,数据库将被销毁。(这可能不是一个完全有效的SQL语句,但我希望我已经明白了我的观点。

仅仅因为您限制了下拉列表中可用的选项,并不意味着您限制了我可以向服务器发送的数据。

如果您试图在页面上进一步限制这种使用行为,我的选择包括禁用该行为,或者只是向您的服务器编写一个自定义HTTP请求,无论如何都会模仿此表单提交。有一个名为curl的工具用于此目的,我认为无论如何提交此SQL注入的命令看起来像这样:

curl --data "size=%27%29%3B%20DROP%20TABLE%20*%3B%20--"  http://www.example.com/profile/save

(这可能不是一个完全有效的 curl 命令,但同样,我希望我已经明白了我的观点。

所以,我要重申:

永远不要相信用户输入。始终保护自己。

不要假设任何用户输入都是安全的。即使它通过形式以外的其他方式到达,它也可能不安全。它都不够值得信赖,无法放弃保护自己免受SQL注入的侵害。


答案 2

您可以执行以下示例等简单操作,以确保发布的大小符合您的预期。

$possibleOptions = array('All', 'Large', 'Medium', 'Small');

if(in_array($_POST['size'], $possibleOptions)) {
    // Expected
} else {
    // Not Expected
}

如果您使用的是 php >= 5.3.0 版本,请使用 mysqli_*来保存结果。如果使用得当,这将有助于sql注入。


推荐