清理HTML输入值

Sanitizing HTML input value

本文关键字:输入 HTML 清理      更新时间:2023-09-26

内部除了引号(")到(")之外,还需要转换什么吗

<input type="text" value="$var">

我个人认为,如果不使用" on*=...,你怎么可能突破这一点。

这是正确的吗?

编辑:显然有些人认为我的问题太模糊了;

<input type="text" value="<script>alert(0)</script>">不执行。因此,如果不使用",就不可能突破使用。

这是正确的吗?

您确实在问两个问题(或者至少可以解释):

  1. 如果不允许使用引号,是否可以注入input[type="text"]的带引号的value属性?

  2. 如果不允许使用引号,是否可以注入元素的任意带引号的属性。

第二个是以下琐碎的演示:

<a href="javascript:alert(1234);">Foo</a>

<div onmousemove="alert(123);">...

第一个有点复杂。

HTML5

根据HTML5规范:

属性值是文本和字符引用的混合体,但有一个额外的限制,即文本不能包含不明确的"与"号。

在引用的属性中进一步细化为:

属性名称,后面跟着零个或多个空格字符,后面跟着一个U+003D EQUALS SIGN字符,后面跟零个或更多空格字符,然后跟着一个"(U+0022)字符,然后跟属性值,除了上面给出的属性值要求外,属性值不得包含任何文字U+0022QUOTETION MARK字符("),最后是第二个"(U+0022)字符

简而言之,除了"不明确的与号"(当结果不是有效的字符引用时为&[a-zA-Z0-9]+;)和引号字符之外的任何字符在属性内部都是有效的。

HTML 4.01

HTML 4.01在语法方面不如HTML5具有描述性(HTML5最初创建的原因之一)。然而,它确实这样说:

当脚本或样式数据是属性(样式或内部事件属性)的值时,作者应根据脚本或样式语言约定,转义该值中出现的分隔单引号或双引号。如果"&"不是字符引用的开头,则作者也应该转义"&"的出现。

注意,这是指作者应该做什么,而不是解析器应该做什么。因此,从技术上讲,解析器可以接受或拒绝无效输入(或将其篡改为有效输入)。

XML 1.0

XML 1.0规范将属性定义为:

属性::=名称Eq属性值

其中AttValue定义为:

属性值::='"'([^<&"]|引用)*'"'|"'"([^<&']|引用

&类似于HTML5中的"不明确的符号"概念,但它基本上是在说"任何未编码的符号"。

但请注意,它明确地从属性值中拒绝<

因此,虽然HTML5允许它,但XML1.0明确拒绝它

这意味着什么

这意味着对于一个兼容且无错误的解析器,HTML5将忽略属性中的<字符,XML将出错。

这也意味着,对于一个兼容且无错误的解析器,HTML 4.01将以未指定且可能奇怪的方式表现(因为规范没有详细说明行为)。

这就是问题的症结所在。在过去,HTML是一个非常松散的规范,以至于每个浏览器都有稍微不同的规则来处理格式错误的HTML。每个人都会试图"修正"它,或者"解释"你的意思。这意味着,虽然兼容HTML5的浏览器不会执行<input type="text" value="<script>alert(0)</script>">中的JS,但没有什么可以说兼容HTML4.01的浏览器不会。没有什么可以说,导致它被执行的XML或HTML5解析器中可能不存在错误(尽管这将是一个相当严重的问题)。

这就是OWASP(以及大多数安全专家)建议您在属性值内编码所有非字母数字字符或&<"的原因。这样做没有任何成本,只增加了知道浏览器的解析器将如何解释值的安全性。

吗?没有。但深度防御表明,由于这样做没有成本,潜在的好处是值得的。

如果你的问题是"什么类型的xss攻击是可能的",那么你最好用谷歌搜索一下

  • 如果输入是由echo '<input type="text" value="$var">'生成的,那么简单的'会破坏它

  • 如果输入是PHP页面中的纯HTML,则value=<?php deadly_php_script ?>会破坏它的

  • 如果这是HTML文件中的纯HTML输入,那么转换双引号就足够了。

尽管如此,转换其他特殊符号(如<>等)也是一种很好的做法。输入将存储在服务器上的输入信息''传输到另一个页面''脚本中,因此您需要检查哪些内容可能会破坏这些文件。假设我们有这样的设置:

index.html:

<form method=post action=getinput.php> <input type="text" name="xss"> <input type="submit"></form>

getinput.php:

echo $_POST['xss'];

输入值;your_deadly_php_script完全破坏了(在这种情况下,您也可以净化服务器端)

如果这还不够,请提供有关您的问题的更多信息,添加更多代码示例。

我认为此人指的是跨站点脚本攻击。他们将其标记为php、安全性和xss

以为例

<input type="text" value=""><script>alert(0)</script><"">

上述代码将执行报警框代码;

<?php $var= "'"><script>alert(0)</script><'""; ?>
<input type="text" value="<?php echo $var ?>">

这也将执行警报框。为了解决这个问题,你需要逃离",<>,以及更多的安全功能。PHP有几个值得研究的函数,每个函数都有起起伏伏!

htmlentities() - Convert all applicable characters to HTML entities
htmlspecialchars() - Convert special characters to HTML entities
get_html_translation_table() - Returns the translation table used by  htmlspecialchars and htmlentities
urldecode() - Decodes URL-encoded string

你必须小心的是,你正在传递一个变量,并且有一些方法可以创建错误,从而导致它爆发。最好的办法是确保数据没有以可执行的方式格式化,以防出现错误。但你是对的,如果他们没有报价,你就无法爆发,但在这一点上,你或我都不理解的某些方式会让这种情况发生。

$var = `"><script>alert(0);</script>`

会起作用。

如果可以关闭引号,则可以关闭标记并打开另一个。但我认为你是对的,如果不结束报价,就不可能注入。