如何在javascript中卸载html?

如何在javascript中卸载html?,javascript,html,escaping,Javascript,Html,Escaping,我正在使用一个web服务,它将为我提供如下价值: var text = "<<<&&&"; 我需要把它打印成“试试Javascript中可用的escape和unescape函数 更多细节:对它的价值进行一些猜测 innerHTML实际上是解释html的浏览器 因此,

我正在使用一个web服务,它将为我提供如下价值:

var text = "<<<&&&";

我需要把它打印成“试试Javascript中可用的escape和unescape函数


更多细节:

对它的价值进行一些猜测

innerHTML实际上是解释html的浏览器

因此,<变成小于符号,因为如果在html文档中放入<,就会出现这种情况

使用&的字符串最大的安全风险是eval语句,任何JSON都可能使应用程序不安全。我不是安全专家,但如果字符串仍然是字符串,那么您应该可以


这是innerHTML安全的另一种方式。未转义的字符串正在变成html,因此不会有运行javascript的风险。

只要您的代码正在创建文本节点,浏览器就不会呈现任何有害内容。事实上,如果您使用Firebug或IE Dev工具栏检查生成的文本节点的源代码,您将看到浏览器正在重新转义特殊字符

给它一个

"<script>"
节点有几种类型:元素、文档、文本、属性等


危险在于浏览器将字符串解释为包含脚本时。innerHTML属性容易出现此问题,因为它将指示浏览器创建元素节点,其中一个可以是脚本元素,或者具有内联Javascript(如onmouseover处理程序)。创建文本节点可避免此问题。

我们的测试字符串指向
b&;&;&;/b
,以便更好地处理风险是什么…(或者更好的是,
img src=)http://www.spam.com/ASSETS/0EE75B480E5B450F807117E06219CDA6/spamReg.png“onload='alert(document.cookie);”
用于窃取cookie的垃圾邮件)

请参见上的示例(基于您的示例,使用prototype进行取消跳过)。尝试单击四个不同的按钮以查看不同的效果。只有最后一个按钮存在安全风险。(您可以查看/编辑上的源代码)该示例实际上并没有窃取您的Cookie

  • 如果您的文本来自已知的安全来源,并且不基于任何用户输入,则您是安全的
  • 如果使用
    createTextNode
    创建文本节点
    appendChild
    将未更改的节点对象直接插入文档中,则安全
  • 否则,您需要采取适当的措施,确保不安全的内容不能进入您的浏览器
  • 注意:使用
    createTextNode
    并不是一个灵丹妙药:使用它来转义字符串,然后使用
    textContent
    innerHTML
    来获取转义文本,并使用它执行其他操作,在以后的使用中不会保护您。特别是,如果使用它来填充属性,它是不安全的。

    这就解释了为什么使用createTextNode的传统智慧实际上并不安全

    function mailpage()
    { mail_str =  "mailto:?subject= Check out the " + escape( document.title ); 
          mail_str += "&body=" + escape("I thought you might be interested in the " + document.title + ".\n\n" );
          mail_str += escape("You can view it at " + location.href + ".\n\n");
          location.href = mail_str;
    }
    
    上述风险条款中有一个代表性的例子:

    function escapeHtml(str) {
        var div = document.createElement('div');
        div.appendChild(document.createTextNode(str));
        return div.innerHTML;
    };
    
    var userWebsite = '" onmouseover="alert(\'derp\')" "';
    var profileLink = '<a href="' + escapeHtml(userWebsite) + '">Bob</a>';
    var div = document.getElementById('target');
    div.innerHtml = profileLink;
    // <a href="" onmouseover="alert('derp')" "">Bob</a>
    
    函数escapeHtml(str){
    var div=document.createElement('div');
    div.appendChild(document.createTextNode(str));
    返回div.innerHTML;
    };
    var userWebsite=''onmouseover=“警报(\'derp\')”;
    var profileLink='';
    var div=document.getElementById('target');
    div.innerHtml=profileLink;
    // 
    
    Im告诉我,用这种方法删除html会导致一些严重的安全问题……这就是我的观点……没问题,我是在你回答后做的……不要否决这个家伙!Escape和unescape函数现在已经被弃用了。例如,有关详细信息,请参见。尽管我不能让它用
    scriptalert('hi')做任何坏事/script
    -出于某种原因,虽然脚本被插入,但它没有运行。但是图像的加载是,所以我利用了它…@Stobor-你能告诉我你的意思吗?我很好奇…@Jeff:已经有一段时间了,但我只是看到了你的问题。我的意思是我无法运行此页面上的脚本:-尽管查看cComputed source显示脚本标记,它不
    alert()
    …不过,我的回答中的警告是有效的。这非常有用。因此,底线是,如果有任何来自用户的信息,应该是TextNode???@Dfectoso:这是一种方法,如果您不希望他们能够使用任何HTML功能,则可以使用这种方法。例如,如果您希望他们对文本进行样式设置,您必须弄清楚如何使用安全…对安全问题的有趣见解。
    如果你使用createTextNode,你是安全的。
    :不,根据@buffer:Ben断章取义地引用了我的答案,这有点狡猾。然而,他在其他方面是对的:使用
    createTextNode
    构建
    escapeHtml
    函数可能不安全。而本页的一个答案曾经建议这样做,我的措辞可能会让其他人觉得网络上其他地方使用
    createTextNode
    的函数更安全。我已经对此进行了澄清。我刚刚发布的答案允许您输入实际的页面标题(带有&;or&;)在主题行中,…html页面的主体将显示在电子邮件的主体中。在构建用于填充元素属性的
    escapeHtml
    方法的用例中,这是不安全的。但是,他的观点是:如果您不能100%确定正在使用函数的上下文,那么您不可能是确保此函数是安全的。
    createTextNode
    在类似
    document.getElementById(“whereItGoes”).appendChild(document.createTextNode(unsafe_str))的构造中正确使用
    不是他所评论的……这个问题怎么可能是重复的?这个问题比假定重复的问题要老。您可以在中看到使用innerHTML的安全问题。要避免XSS漏洞,您应该使用。您可以在另一个中看到代码示例。
    function mailpage()
    { mail_str =  "mailto:?subject= Check out the " + escape( document.title ); 
          mail_str += "&body=" + escape("I thought you might be interested in the " + document.title + ".\n\n" );
          mail_str += escape("You can view it at " + location.href + ".\n\n");
          location.href = mail_str;
    }
    
    function escapeHtml(str) {
        var div = document.createElement('div');
        div.appendChild(document.createTextNode(str));
        return div.innerHTML;
    };
    
    var userWebsite = '" onmouseover="alert(\'derp\')" "';
    var profileLink = '<a href="' + escapeHtml(userWebsite) + '">Bob</a>';
    var div = document.getElementById('target');
    div.innerHtml = profileLink;
    // <a href="" onmouseover="alert('derp')" "">Bob</a>