假设我们有一个用户输入各种信息的表单。我们验证信息,发现有问题。字段丢失,电子邮件无效,等等。
当再次向用户显示表单时,我当然不希望他再次键入所有内容,因此我想填充输入字段。没有卫生处理这样做是否安全?如果没有,那么应该首先进行的最小消毒是什么?
并澄清:在添加到数据库或在网站的其他地方显示之前,它当然会被消毒。
答案 0 :(得分:8)
不,不是。用户可能会从第三方网站定向到表单,或者只是输入会破坏HTML的数据(无辜)。
将具有特殊含义的任何字符转换为其HTML实体。
即。 &
至&
,<
至<
,>
至>
和"
至"
(假设您使用"
而不是'
来划分属性值。
在Perl中使用HTML::Entities,在TT中使用html filter,在PHP中使用htmlspecialchars。否则,请使用您正在使用的语言寻找类似的内容。
答案 1 :(得分:1)
这不安全,因为如果有人可以强制用户向表单提交特定数据,您将输出它并由浏览器“执行”。例如,如果用户被迫提交'/><meta http-equiv="refresh" content="0;http://verybadsite.org" />
,那么将发生不需要的重定向。
答案 2 :(得分:1)
如果不先对其进行编码,则无法将用户提供的数据插入到HTML文档中。您的目标是确保不能更改文档的结构,并始终将数据视为数据值,而不是HTML标记或Javascript代码。对此机制的攻击通常称为“跨站点脚本”,或简称为“XSS”。
如果插入HTML属性值,则必须确保该字符串不会导致属性值过早结束。当然,您还必须确保标签本身无法结束。您可以通过HTML编码来实现这一点,这些字符不能保证是安全的。
如果您编写HTML以便标记属性的值出现在一对双引号或单引号字符中,那么您只需要确保对您选择使用的引号字符进行html编码。如果你不正确引用你的属性,如上所述,那么你需要担心更多的字符,包括空格,符号,标点和其他ascii控制字符。 虽然,老实说,无论如何,编码这些非字母数字字符可能是最安全的。
请记住,HTML属性值可能出现在3种不同的语法上下文中:
双引号属性值
<input type="text" value="**insert-here**" />
您只需要将双引号字符编码为合适的HTML安全值,例如"
单引号属性值
<input type='text' value='**insert-here**' />
您只需要将单引号字符编码为合适的HTML安全值,例如‘
不带引号的属性值
<input type='text' value=**insert-here** />
你不应该有没有引号的html标签属性值,但有时这是你无法控制的。在这种情况下,我们真的需要担心空格,标点符号和其他控制字符,因为它们会使我们脱离属性值。
除字母数字字符外,使用&#xHH;
格式(或命名实体,如果可用)转义ASCII值小于256的所有字符,以防止切换出属性。不带引号的属性可以包含许多字符,包括[space]
%
*
+
,
-
/
{{1 } ;
<
=
>
和^
(以及更多)。 [从OWASP取消]
请记住,上述规则仅适用于在插入HTML属性值时控制注入。在页面的其他区域中,适用其他规则。
有关详细信息,请参阅XSS prevention cheat sheet at OWASP
答案 3 :(得分:0)
是的,它是安全的,前提是您正确编码了值。
放置在HTML中的属性内的值需要进行HTML编码。您正在使用的服务器端平台应具有此方法。例如,在ASP.NET中有一个Server.HtmlEncode
方法,TextBox
控件将自动对您放在Text
属性中的值进行HTML编码。