清理HTML输入值
Sanitizing HTML input value
内部除了引号("
)到("
)之外,还需要转换什么吗
<input type="text" value="$var">
我个人认为,如果不使用" on*=...
,你怎么可能突破这一点。
这是正确的吗?
编辑:显然有些人认为我的问题太模糊了;
<input type="text" value="<script>alert(0)</script>">
不执行。因此,如果不使用"
,就不可能突破使用。
这是正确的吗?
您确实在问两个问题(或者至少可以解释):
-
如果不允许使用引号,是否可以注入
input[type="text"]
的带引号的value
属性? -
如果不允许使用引号,是否可以注入元素的任意带引号的属性。
第二个是以下琐碎的演示:
<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>`
会起作用。
如果可以关闭引号,则可以关闭标记并打开另一个。但我认为你是对的,如果不结束报价,就不可能注入。
- Angularjs$编译输入html或元素
- 将输入 html 元素动态关联到颜色选取器
- 如何使用 JavaScript 显示 html 输入:.html(' < input type=“text” /
- 在输入 HTML 表单上从 Java 脚本传递参数
- 如何根据用户输入 HTML 更新多个 SPAN 元素
- 如何计算输入 HTML 元素的宽度,使其与其内容的大小相匹配
- 如何在输入 html 中编写一个 js var 值
- Javascript:如何获取所选复选框的所有值,推送到数组,然后放入输入HTML元素
- 如何使用Javascript自动输入html中行的序列号
- 特殊的点屏蔽输入 HTML-JavaScript
- 在select选项和input.text之间切换输入html
- 隐藏输入(html表单确认)-服务器端脚本?(php)
- 验证用户输入HTML子集
- 在KeyUp上输入HTML/JavaScript密码,用于浏览器自动填充
- 按钮内文本输入- HTML
- 在ie10,9中选择选项(html 5标签)在下一个输入(html 5标签)的位置
- 有麻烦输入html列表选项从xml文件
- 在非输入html标签上使用ng-keyup
- 在表数据中输入Html文本
- 中心文件输入- Html/Css