我认识到基于我想要使用某些参数的上下文,至少有4种编码可以避免执行损坏的代码:
构建javascript代码时的Javascript编码,例如
var a = "what's up ?"
var b = "alert('" + a + "');"
eval(b); // or anything else that executes b as code
将字符串用作url中的参数时的URL编码,例如
var a = "Bonnie & Clyde";
var b = "mypage.html?par=" + a;
window.location.href = b; // or anything else that tries to use b as URL
使用字符串作为某个元素的HTML源时的HTML编码,例如
var a = "<script>alert('hi');</script>";
b.innerHTML = a; // or anything else that interprets a directly
使用字符串作为属性值时的HTML属性编码,例如
var a = 'alert("hello")';
var b = '<img onclick="' + a + '" />'; // or anything else that uses a as a (part of) a tag's attribute
在ASP.NET代码隐藏中,我知道在所有4种情况下编码字符串的方法(使用例如DataContractJsonSerializer
,HttpUtility.UrlEncode
,HttpUtility.HtmlEncode
和HttpUtility.HtmlAttributeEncode
),知道是否有一些实用程序可以直接从javascript使用来编码/解码这四种情况下的字符串。
答案 0 :(得分:3)
案例2可以使用 encodeURIComponent()处理,作为danp suggested。
案例3 won't execute the script in most browsers。如果您希望文档的输出为<script>...</script>
,则应该编辑元素的文本内容:
var a = "<script>alert('hi');</script>";
if ("textContent" in b)
b.textContent = a; // W3C DOM
else
b.innerText = a; // Internet Explorer <=8
案例1和案例4并不是真正的编码问题,而是卫生问题。对传递给这些函数的字符串进行编码可能会导致语法错误,或者仅导致未分配给任何内容的字符串值。消毒通常涉及寻找某些模式,或允许采取行动或禁止采取行动 - 拥有白名单比黑名单更安全(这听起来很可怕!)。
Internet Explorer 8有一个名为window.toStaticHTML()的有趣功能,它将从HTML字符串中删除任何脚本内容。在插入DOM之前清理HTML非常有用。不幸的是,它是专有的,所以你不会在其他浏览器中找到这个功能。
答案 1 :(得分:1)
您可以将javascript函数escape(..)
用于其中一些目的。
encodeURI()
,decodeURI()
等是前进的方向!详情here。
转义和unescape函数没有 适用于非ASCII字符 并已被弃用。在 JavaScript 1.5及更高版本,使用 encodeURI,decodeURI, encodeURIComponent,和 decodeURIComponent。
escape和unescape函数让 你编码和解码字符串。该 escape函数返回 中的参数的十六进制编码 ISO拉丁字符集。该 unescape函数返回ASCII 指定十六进制的字符串 编码值。编码值。