如何在javascript中处理不同类型的编码

时间:2010-09-08 09:58:16

标签: c# javascript asp.net html encoding

我认识到基于我想要使用某些参数的上下文,至少有4种编码可以避免执行损坏的代码:

  1. 构建javascript代码时的Javascript编码,例如

    var a = "what's up ?"
    var b = "alert('" + a + "');"
    eval(b); // or anything else that executes b as code
    
  2. 将字符串用作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
    
  3. 使用字符串作为某个元素的HTML源时的HTML编码,例如

    var a = "<script>alert('hi');</script>";
    b.innerHTML = a; // or anything else that interprets a directly
    
  4. 使用字符串作为属性值时的HTML属性编码,例如

    var a = 'alert("hello")';
    var b = '<img onclick="' + a + '" />'; // or anything else that uses a as a (part of) a tag's attribute
    
  5. 在ASP.NET代码隐藏中,我知道在所有4种情况下编码字符串的方法(使用例如DataContractJsonSerializerHttpUtility.UrlEncodeHttpUtility.HtmlEncodeHttpUtility.HtmlAttributeEncode ),知道是否有一些实用程序可以直接从javascript使用来编码/解码这四种情况下的字符串。

2 个答案:

答案 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(..)用于其中一些目的。

e:真的忘了!抱歉,这是一个弃用的功能 - encodeURI()decodeURI()等是前进的方向!详情here

  

转义和unescape函数没有   适用于非ASCII字符   并已被弃用。在   JavaScript 1.5及更高版本,使用   encodeURI,decodeURI,   encodeURIComponent,和   decodeURIComponent。

     

escape和unescape函数让   你编码和解码字符串。该   escape函数返回   中的参数的十六进制编码   ISO拉丁字符集。该   unescape函数返回ASCII   指定十六进制的字符串   编码值。编码值。