我在这里读过“从不相信用户输入”的口头禅,这是有道理的。我可以理解用户输入的任何字段都是可疑的。但是,下拉选择字段呢?它们可以用于任何类型的注射吗?
我已经清理了所有允许用户输入的字段,并且还使用了 mysqli 准备好的语句来插入数据库。
但是,我的表单中有三个下拉菜单,我想知道我是否需要对它们做任何事情?
我在这里读过“从不相信用户输入”的口头禅,这是有道理的。我可以理解用户输入的任何字段都是可疑的。但是,下拉选择字段呢?它们可以用于任何类型的注射吗?
我已经清理了所有允许用户输入的字段,并且还使用了 mysqli 准备好的语句来插入数据库。
但是,我的表单中有三个下拉菜单,我想知道我是否需要对它们做任何事情?
网站中的每一个元素都可以被恶意用户更改(隐藏字段、div、样式、ajax 调用,你可以命名它......)。
也就是说,如果您已经在使用 Prepared Statements,则不必太担心 SQL 注入,因为 mysql 已经知道将要执行哪些语句。
相反,您应该清理网站中呈现的所有输出。
假设在你的表格中,你问我以这种方式住在哪个国家:
<select name="country">
<option value="Mexico">Mexico</option>
<option value="USA">USA</option>
<option value="Canada">Canada</option>
</select>
但我是恶意用户,我使用 Chrome 的代码检查器来更改您的 HTML,我选择了墨西哥,但将其值更改为
<script type="text/javascript">alert("Hello World");</script>
如果您以这种方式在另一个页面中输出该值:
Your country is: <?=$country?>
然后你会写:
Your country is:
<script type="text/javascript">alert("Hello World")</script>
并且会弹出一个带有文本“Hello World”的警告框
你可能想知道我能造成什么伤害......
好吧,我可以用它做任何我想做的事情,我可以窃取 cookie,或者如果该值是公开的(假设您在首页显示该值),那么我可以将您的用户重定向到另一个网站,更改您网站的内容.. . 随心所欲。
要清理用户的输出,您可以使用
htmlentities
例如,这会将<
>
符号转换为其各自的代码:<
和>
恶意用户很容易在<select>
字段、隐藏字段或其他任何内容中注入数据。正如口头禅所说,永远不要相信用户输入。
我建议您清理来自表单输入的所有数据。诚然,默认情况下,用户可能无法直接编辑您的字段,但如果您不清理传入数据,则巧妙设计的伪装成您的表单提交可能会在您的脚本和/或数据库中允许一些恶意代码。
在选择列表上使用准备好的语句和清理程序可能仍然是一个好主意,因为大多数浏览器的开发工具和检查模式都允许用户动态修改 HTML 元素的值、属性和属性。恶意用户可能会使用选择列表项尝试此技巧。
许多现代浏览器都具有源代码修改功能。所以是的,任何客户端-> 服务器信息都可以被注入。
但是,如果您对所有 $_POST 或 $_GET 数据使用绑定变量,则应该没问题。
是的,在浏览器控制台(几乎所有现代浏览器都有)中使用简单的 Javascript,他们可以将 select 的值更改为他们想要的任何值。如果需要,他们还可以为输入文本字段添加 HTML。
Javascript 只是最简单的方法,还有很多其他方法可以控制脚本的 $_POST 变量。请记住,$_POST 和 $_GET 是用户提供的变量。完全不要相信他们!
注入可以在用户输入期间发生,他们是输入字符串的人。
在您使用 select 的情况下,您是定义选项的人,并且您自己知道这些选项不会成为注入的原因。
好吧,如果用户可以定义选项,他们可以使用 select 进行注入攻击。
在您的下拉列表中要做的一件好事是使用您在输入中使用的相同代码来防止注入攻击。在获得值时对每个控件进行相同的处理。