Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Html 在没有消毒的情况下将用户输入显示为输入值是否安全?_Html_Security_Xss_User Input - Fatal编程技术网

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标记属性值,但有时这是你无法控制的。在这种情况下,我们真的需要担心空格、标点符号和其他控制字符,因为它们会使我们脱离属性值

除字母数字字符外,使用
&#xHH;
格式(或命名实体,如果可用)对ASCII值小于256的所有字符进行转义,以防止切换出属性。未加引号的属性可以用许多字符分隔,包括
[空格]
%
*
+
-
^
(及更多)。[摘自OWASP的段落]

请记住,上述规则仅适用于插入HTML属性值时的控件注入。在页面的其他区域中,其他规则也适用


有关更多信息,请参见

如果您是正确的,OP没有说明上下文,它仅在输入数据的上下文中,以便其他人能够看到(或者能够自动填充并将现有/登录的用户重定向到您的页面)。如果没有此功能,您只需自己执行XSS,这是非常无用的。攻击者可以生成一个链接,模拟发送表单(获取参数),因此可以对其他人进行XSS攻击。请小心使用这些函数,这些函数试图为解决所有注入问题提供一站式解决方案。我在任何语言中都没有见过一个函数在HTML页面的所有区域都有效。(或者至少在不破坏数据的情况下)。仅应用PHP htmlspecialchars()这里提到的属性值肯定不能保证您的安全。@Cheekysoft:怎么会这样?如果您对所有特殊字符进行编码,那么会发生什么?如果浏览器显示所有内容都正常,那么就无法“突破”属性/tag.htmlspecialchars()将在属性值中保持安全,除非您使用
'
分隔属性值,并且不将change
ENT\u COMPAT
设置为
ENT\u QUOTES
Ahem。我想您的意思是消毒而不是卫生!@John:您可能非常正确:p应该解释这个问题。@M.A:不太正确,因为我说的是输入SQL查询中未使用。如果有人强迫我将其输入浏览器并提交,那么浏览器下一步做什么我就不必担心了。这是一个很糟糕的例子,因为提交到OP的登录表单的表单必须位于单独的站点上。因此攻击者将