Html 在没有消毒的情况下将用户输入显示为输入值是否安全?
假设我们有一个表单,用户在其中键入各种信息。我们验证了这些信息,发现有问题。字段丢失、电子邮件无效等 当再次向用户显示表单时,我当然不希望他再次键入所有内容,因此我希望填充输入字段。在没有消毒的情况下这样做安全吗?如果没有,应首先进行的最低消毒是什么Html 在没有消毒的情况下将用户输入显示为输入值是否安全?,html,security,xss,user-input,Html,Security,Xss,User Input,假设我们有一个表单,用户在其中键入各种信息。我们验证了这些信息,发现有问题。字段丢失、电子邮件无效等 当再次向用户显示表单时,我当然不希望他再次键入所有内容,因此我希望填充输入字段。在没有消毒的情况下这样做安全吗?如果没有,应首先进行的最低消毒是什么 澄清:它当然会在被添加到数据库或显示在网站的其他地方之前被净化。不,它不是。用户可能会从第三方站点被引导到表单,或者简单地输入(无意中)会破坏HTML的数据 将任何具有特殊含义的字符转换为其HTML实体 i、 e.和至&,到和“到”(假设您使
澄清:它当然会在被添加到数据库或显示在网站的其他地方之前被净化。不,它不是。用户可能会从第三方站点被引导到表单,或者简单地输入(无意中)会破坏HTML的数据 将任何具有特殊含义的字符转换为其HTML实体 i、 e.
和
至&
,
到
和“
到”
(假设您使用“
而不是”
来定义属性值)
在Perl中使用,在TT中使用,在PHP中使用。否则,请在您使用的语言中查找类似的内容。是的,这是安全的,当然前提是您正确地编码了值
放置在HTML属性中的值需要进行HTML编码。您正在使用的服务器端平台应该有相应的方法。例如,在ASP.NET中有一个
server.HtmlEncode
方法,TextBox
控件将自动对您放置在Text
pro中的值进行HTML编码perty.这是不安全的,因为如果有人可以强制用户向您的表单提交特定数据,您将输出该数据并将其“执行”"通过浏览器。例如,如果用户被迫提交'/>
,结果将发生不必要的重定向。您不能在不先编码的情况下将用户提供的数据插入HTML文档。您的目标是确保文档的结构不能更改,并且数据始终被视为数据值nd从来都不是HTML标记或Javascript代码。针对这种机制的攻击通常被称为“跨站点脚本”,或简称为“XSS”
如果插入到HTML属性值中,则必须确保字符串不会导致属性值过早结束。当然,还必须确保标记本身不会结束。可以通过HTML编码任何不保证安全的字符来实现这一点
如果编写HTML使标记属性的值显示在一对双引号或单引号字符中,则只需确保对所选引号字符进行HTML编码。如果没有按照上述说明正确引用属性,则需要担心更多字符,包括白色字符空格、符号、标点和其他ascii控制字符。不过,老实说,对这些非字母数字字符进行编码可能是最安全的
请记住,HTML属性值可能出现在3种不同的语法上下文中:
双引号属性值
<input type="text" value="**insert-here**" />
<input type='text' value='**insert-here**' />
<input type='text' value=**insert-here** />
只需将单引号字符编码为合适的HTML安全值,如;
不带引号的属性值
<input type="text" value="**insert-here**" />
<input type='text' value='**insert-here**' />
<input type='text' value=**insert-here** />
你不应该有一个没有引号的html标记属性值,但有时这是你无法控制的。在这种情况下,我们真的需要担心空格、标点符号和其他控制字符,因为它们会使我们脱离属性值
除字母数字字符外,使用HH;
格式(或命名实体,如果可用)对ASCII值小于256的所有字符进行转义,以防止切换出属性。未加引号的属性可以用许多字符分隔,包括[空格]
%
*
+
,
-
;
^
和
(及更多)。[摘自OWASP的段落]
请记住,上述规则仅适用于插入HTML属性值时的控件注入。在页面的其他区域中,其他规则也适用
有关更多信息,请参见如果您是正确的,OP没有说明上下文,它仅在输入数据的上下文中,以便其他人能够看到(或者能够自动填充并将现有/登录的用户重定向到您的页面)。如果没有此功能,您只需自己执行XSS,这是非常无用的。攻击者可以生成一个链接,模拟发送表单(获取参数),因此可以对其他人进行XSS攻击。请小心使用这些函数,这些函数试图为解决所有注入问题提供一站式解决方案。我在任何语言中都没有见过一个函数在HTML页面的所有区域都有效。(或者至少在不破坏数据的情况下)。仅应用PHP htmlspecialchars()这里提到的属性值肯定不能保证您的安全。@Cheekysoft:怎么会这样?如果您对所有特殊字符进行编码,那么会发生什么?如果浏览器显示所有内容都正常,那么就无法“突破”属性/tag.htmlspecialchars()将在属性值中保持安全,除非您使用'
分隔属性值,并且不将changeENT\u COMPAT
设置为ENT\u QUOTES
Ahem。我想您的意思是消毒而不是卫生!@John:您可能非常正确:p应该解释这个问题。@M.A:不太正确,因为我说的是输入SQL查询中未使用。如果有人强迫我将其输入浏览器并提交,那么浏览器下一步做什么我就不必担心了。这是一个很糟糕的例子,因为提交到OP的登录表单的表单必须位于单独的站点上。因此攻击者将