当前位置: 首页 > 知识库问答 >
问题:

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

董阳平
2023-03-14

我理解,您永远不应该信任表单中的用户输入,这主要是由于SQL注入的可能性。

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

我保存的$_POST['size']到一个会话,然后使用整个网站查询各种数据库(与mysqli选择查询)和任何SQL注入肯定会伤害(可能下降)他们。

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

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

共有3个答案

孙经艺
2023-03-14

由于这个问题被标记为sql注入,以下是关于这种特殊攻击的答案:

正如注释中告诉您的那样,对于涉及任何变量数据的每个查询,都必须使用准备好的语句,没有例外。

不管任何超文本标记语言的东西!
重要的是要理解SQL查询必须正确格式化,而不管任何外部因素,无论是超文本标记语言输入还是其他任何因素。

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

在这里,你可以找到一个彻底的解释,为什么准备好的声明是必须的,如何正确使用它们,它们在哪里不适用,在这种情况下该怎么办:SQL注射保护的搭便车指南

此外,这个问题被标记为mysqli。我认为这主要是偶然的,但无论如何,我必须警告您,原始mysqli并不能完全替代旧的mysq\u*函数。只是因为如果在旧样式中使用,它将不会增加任何安全性。虽然它对预先准备好的语句的支持是痛苦和麻烦的,但一般的PHP用户根本无法做到这一点。因此,如果没有ORM或某种抽象库是可选的,那么PDO是您唯一的选择。

侯英达
2023-03-14

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

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

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

如果您使用的是php版本,请使用mysqli\u*

尹超
2023-03-14

让我用Firefox的开发人员控制台向您说明原因:

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

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

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

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

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

因此,我要重申:

不要假设任何用户输入都是安全的。即使它通过表单以外的其他方式到达,它也可能是不安全的。没有一个值得信任到放弃保护自己免受SQL注入。

 类似资料:
  • 问题内容: 我知道您绝不应该信任表单中的用户输入,主要是因为有注入SQL的机会。 但是,这是否也适用于唯一输入来自下拉菜单的表单(请参见下文)? 我将其保存到一个Session中,然后在整个站点中使用它来查询各种数据库(使用Select查询),任何SQL注入肯定会损害(可能会删除)它们。 没有类型输入的用户输入可以查询数据库的区域,只有下拉列表。 问题答案: 您可以像以下示例一样简单地进行操作,以

  • 当我尝试在没有模式注册表的情况下运行Kafka时, 我遇到一个错误,如需要CONNECT\u VALUE\u CONVERTER\u SCHEMA\u REGISTRY\u URL。命令[/usr/local/bin/dub sure CONNECT\u VALUE\u CONVERTER\u SCHEMA\u REGISTRY\u URL]失败! 设置kafka connect是否必须使用架构注

  • 问题内容: 我正在使用MySQL API的功能 根据文档,它转义以下字符: 现在,我查看了OWASP.org的ESAPI安全库,并在Python端口中包含以下代码(http://code.google.com/p/owasp- esapi-python/source/browse/esapi/codecs/mysql。 py ): 现在,我想知道是否真的需要转义所有这些字符。我知道为什么%和_在那

  • 问题内容: 我有一个现有的代码,其中应用程序根据很多条件生成不同的sql并通过hibernate会话createSQLQuery()执行它们。在这里,这些参数与作为普通字符串替换驻留在java类中的sql字符串相连接。现在的问题是,我需要防止sql注入。因此,为此,我必须使用getNamedQuery()并绑定参数,以便hibernate将处理特殊字符。但是问题在于将字符串sql的字符串移动到xm

  • 问题内容: 我有以下代码: 在这种情况下,我需要mysql_real_escape_string还是可以吗? 问题答案: 不,在使用准备好的语句时,您不必自己逃避价值 (即,您不需要调用):DB引擎将自己执行该操作。 (实际上,如果您正在调用并使用绑定参数,则您的字符串将被转义两次- 并不是很好:您最终会到处转义字符…) 附带说明:您的值以整数形式传递 (如所示),因此即使您未使用准备好的语句,也

  • 问题内容: 在http://www.justinshattuck.com/2007/01/18/mysql-injection-cheat- sheet/?akst_action=share- this上 ,有一节声称您可以使用某些亚洲字符编码绕过mysql_real_escape_string 用BIG5或GBK绕过mysql_real_escape_string() “注入线” に关する追加情