irc*_*ell 24
你问的确有两个问题(至少可以解释):
如果不允许报价,是否可以注入引用的value属性input[type="text"]?
如果不允许引用,可以注入元素的任意引用属性.
第二部分通过以下方式进行了简单的演示:
<a href="javascript:alert(1234);">Foo</a>
Run Code Online (Sandbox Code Playgroud)
要么
<div onmousemove="alert(123);">...
Run Code Online (Sandbox Code Playgroud)
第一个有点复杂.
根据HTML5规范:
属性值是文本和字符引用的混合,除了文本不能包含模糊符号的附加限制.
在引用属性中进一步细化为:
属性名称,后跟零个或多个空格字符,后跟单个U + 003D EQUALS SIGN字符,后跟零个或多个空格字符,后跟单个"""(U + 0022)字符,后跟属性值,除了上面给出的属性值要求之外,不得包含任何文字U + 0022 QUOTATION MARK字符("),最后是第二个单字"""(U + 0022)字符.
因此,简而言之,除了"模糊的&符号"(&[a-zA-Z0-9]+;当结果不是有效的字符引用时)和引号字符之外的任何字符在属性内部都是有效的.
HTML 4.01关于语法的描述性低于HTML5(HTML5最初创建的原因之一).但是,确实这样说:
当脚本或样式数据是属性的值(样式或内部事件属性)时,作者应根据脚本或样式语言约定在值中转义分隔单引号或双引号的出现.如果"&"不是字符引用的开头,作者也应该避免出现"&".
注意,这是说作者应该做什么,而不是解析器应该做什么.因此,解析器可以在技术上接受或拒绝无效输入(或将其修改为有效).
的XML 1.0规格定义的属性为:
Attribute :: = Name Eq AttValue
其中AttValue定义为:
AttValue :: ='"'([^ <&"] |参考)*'"'|''"([^ <&'] |参考)*"'"
这&类似于HTML5中"模糊的&符号"的概念,但它基本上是在说"任何未编码的&符号".
请注意,它明确拒绝<属性值.
因此,虽然HTML5允许它,但XML1.0明确否认它.
这意味着对于兼容且<无错误的解析器,HTML5将忽略属性中的字符,并且XML将出错.
这也意味着对于兼容且无错误的解析器,HTML 4.01将以未指定的和可能奇怪的方式运行(因为规范没有详细说明行为).
这归结为问题的症结所在.在过去,HTML是如此宽松的规范,每个浏览器对于如何处理格式错误的HTML有不同的规则.每个人都会尝试"修复"它,或"解释"你的意思.这意味着虽然符合HTML5的浏览器不会执行JS <input type="text" value="<script>alert(0)</script>">,但没有什么可以说HTML 4.01兼容的浏览器不会.并且没有什么可以说XML或HTML5解析器中可能不存在导致它被执行的错误(尽管这将是一个非常重要的问题).
THAT就是为什么OWASP(也是最安全专家)推荐你要么编码的所有非字母数字字符或&<"属性值内.这样做没有任何代价,只有增加了解浏览器解析器如何解释值的安全性.
你有吗?没有.但深度防御表明,由于这样做没有成本,潜在的好处是值得的.
当用户提交数据时,您需要确保他们提供了您期望的内容.
例如,如果您需要一个数字,请确保提交的数据是一个数字.您还可以将用户数据转换为其他类型.提交的所有内容最初都被视为字符串,因此强制将已知数字数据转换为整数或浮点数使得清理快速且无痛.
您需要确保不应包含任何HTML内容的字段实际上不包含HTML.有不同的方法可以解决这个问题.
您可以尝试使用htmlspecialchars转义HTML输入.你不应该使用htmlentities来中和HTML,因为它还会执行它认为也需要编码的重音和其他字符的编码.
您可以尝试删除任何可能的HTML.strip_tags快速简便,但也很邋..HTML Purifier在删除所有HTML以及允许标签和属性的选择性白名单方面做得更彻底.
您可以使用OWASP PHP过滤器.它们使用起来非常简单有效.
您可以使用过滤器扩展,它提供了一种全面的方法来清理用户输入.
例子
以下代码将从字符串中删除所有HTML标记:
$string = "<h1>Hello, World!</h1>";
$new_string = filter_var($string, FILTER_SANITIZE_STRING);
// $new_string is now "Hello, World!"
Run Code Online (Sandbox Code Playgroud)
以下代码将确保变量的值是有效的IP地址:
$ip = "127.0.0.1";
$valid_ip = filter_var($ip, FILTER_VALIDATE_IP);
// $valid_ip is TRUE
$ip = "127.0.1.1.1.1";
$valid_ip = filter_var($ip, FILTER_VALIDATE_IP);
// $valid_ip is FALSE
Run Code Online (Sandbox Code Playgroud)
清理和验证电子邮件地址:
<?php
$a = 'joe@example.org';
$b = 'bogus - at - example dot org';
$c = '(bogus@example.org)';
$sanitized_a = filter_var($a, FILTER_SANITIZE_EMAIL);
if (filter_var($sanitized_a, FILTER_VALIDATE_EMAIL)) {
echo "This (a) sanitized email address is considered valid.\n";
}
$sanitized_b = filter_var($b, FILTER_SANITIZE_EMAIL);
if (filter_var($sanitized_b, FILTER_VALIDATE_EMAIL)) {
echo "This sanitized email address is considered valid.";
} else {
echo "This (b) sanitized email address is considered invalid.\n";
}
$sanitized_c = filter_var($c, FILTER_SANITIZE_EMAIL);
if (filter_var($sanitized_c, FILTER_VALIDATE_EMAIL)) {
echo "This (c) sanitized email address is considered valid.\n";
echo "Before: $c\n";
echo "After: $sanitized_c\n";
}
?>
Run Code Online (Sandbox Code Playgroud)
参考:
http://code.tutsplus.com/tutorials/sanitize-and-validate-data-with-php-filters--net-2595
| 归档时间: |
|
| 查看次数: |
20503 次 |
| 最近记录: |