在没有消毒的情况下将用户输入显示为输入值是否安全?

时间:2010-03-16 10:06:32

标签: html security xss user-input

假设我们有一个用户输入各种信息的表单。我们验证信息,发现有问题。字段丢失,电子邮件无效,等等。

当再次向用户显示表单时,我当然不希望他再次键入所有内容,因此我想填充输入字段。没有卫生处理这样做是否安全?如果没有,那么应该首先进行的最小消毒是什么?

并澄清:在添加到数据库或在网站的其他地方显示之前,它当然会被消毒。

4 个答案:

答案 0 :(得分:8)

不,不是。用户可能会从第三方网站定向到表单,或者只是输入会破坏HTML的数据(无辜)。

将具有特殊含义的任何字符转换为其HTML实体。

即。 &&amp;<&lt;>&gt;"&quot;(假设您使用"而不是'来划分属性值。

在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安全值,例如&quot;

单引号属性值

<input type='text' value='**insert-here**' />

您只需要将单引号字符编码为合适的HTML安全值,例如&#145;

不带引号的属性值

<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编码。