如果我使用下拉菜单,是否必须防范SQL注入?

我明白,您绝不应该信任来自表单的用户输入,主要是由于SQL注入的可能性。

但是,这是否也适用于唯一输入来自下拉菜单的形式(请参见下文)?

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

没有区域用于输入查询数据库的类型用户输入,只有下拉(s)。

<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>

你可以做一些简单的事情,以确保发布的大小符合你的期望。

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

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

然后使用mysqli_ *,如果您使用的是您应该使用的php> = 5.3.0版本,则可以保存您的结果。 如果使用正确,这将有助于SQL注入。


是的,你需要防范这一点。

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

我已将下拉列表中的一个值编辑为drop table语句

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

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

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

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

(这可能不是一个完全有效的curl命令,但是我希望我已经得到了我的观点。)

所以,我会重申:

绝不信任用户输入。 总是保护自己。

不要以为任何用户输入都是安全的。 即使通过表单之外的其他方式到达,它也可能是不安全的。 它不值得信任,无法放弃SQL注入。


由于这个问题被标记为SQL注入,这里是关于这种特殊类型的攻击的答案:

正如您在评论中告诉的那样,您必须为涉及任何可变数据的每一个查询使用准备好的语句 无一例外

无论任何HTML的东西!
理解SQL查询必须正确格式化是非常重要的, 无论外部因素如何无论是HTML输入还是其他任何东西。

虽然您可以使用其他答案中提供的白名单来进行输入验证, 但不应影响任何与SQL相关的操作 - 无论您是否验证了HTML输入,它们都必须保持不变。 这意味着在将任何变量添加到查询中时仍然需要使用预准备语句。

在这里你可以找到一个详尽的解释,为什么准备好的语句是必须的,以及如何正确地使用它们,以及它们不适用的地方以及在这种情况下应该怎么做:SQL注入保护的Hitchhiker指南

此外,这个问题被标记为mysqli。 大部分是偶然的,我认为,但无论如何,我必须警告你,原始的mysqli 并不能代替旧的mysq_ *函数 。 仅仅因为如果以旧式使用,它将不会增加任何安全性。 尽管对准备好的语句的支持是痛苦和麻烦的,但平均PHP用户根本无法完成这些操作。 因此,如果没有ORM或某种抽象库选项,那么PDO是您唯一的选择。

链接地址: http://www.djcxy.com/p/16799.html

上一篇: Do I have to guard against SQL injection if I used a dropdown?

下一篇: How can I prevent SQL injection in PYTHON