English 中文(简体)
宣传用户投入,然后在Javascript向OM增加投入
原标题:Sanitizing user input before adding it to the DOM in Javascript

在我自由时间工作时,我撰写一份供聊天申请表,我需要拥有根据用户提交的数据变化的超文本识别资料。 这通常在概念上很模糊,我甚至不会试图这样做,但我看不出我今天选择的很多东西。 那么,我需要做的是逃脱超文本,以确保它获得XSS或打破超文本的许可。

该法典:

var user_id = escape(id)
var txt =  <div class="chut"> +
             <div class="log" id="chut_ +user_id+ "></div> +
             <textarea id="chut_ +user_id+ _msg"></textarea> +
             <label for="chut_ +user_id+ _to">To:</label> +
             <input type="text" id="chut_ +user_id+ _to" value= +user_id+  readonly="readonly" /> +
             <input type="submit" id="chut_ +user_id+ _send" value="Message"/> +
           </div> ;

避免上述任何问题的最佳途径是什么? 各位可以看到,现在使用“<代码>e爱护法/代码”功能的Im,但我并不肯定这一功能与其他选择相比是多么好。 通常用于在案文节点上而不是id之前使投入制度化。

最佳回答

<>Never useeinski(<>/code>. 它与超文本编码无关。 它更像URL-encoding,但甚至不适当。 它是 only本仅有的一条荒.。

如果你想要的是超文本,那么,你不得不在Javagustt给你的情况下书写。 例如:

function encodeHTML(s) {
    return s.replace(/&/g,  &amp; ).replace(/</g,  &lt; ).replace(/"/g,  &quot; );
}

然而,虽然这足以在<条码>输入值等地方将<条码>用户_id贴上<条码>,但这还不够。 由于身份证只能使用有限的特性选择。 (And % isn t among them, so einski ( or Even encodeURIComponent ( is no good.)

您可以发明自己的编码计划,将任何特性列入一个身份证,例如:

function encodeID(s) {
    if (s===  ) return  _ ;
    return s.replace(/[^a-zA-Z0-9.-]/g, function(match) {
        return  _ +match[0].charCodeAt(0).toString(16)+ _ ;
    });
}

但是,如果同一<条码>用户_id发生两次,则你会遇到一个问题。 坦率地说,扔在超文本上的做法通常是一种坏的想法。 而是使用DOM方法,并保留对每个要素的Java式字句,因此,你不必继续使用getElementById,或者担心如何将任意扼杀列入ID。

例如:

function addChut(user_id) {
    var log= document.createElement( div );
    log.className=  log ;
    var textarea= document.createElement( textarea );
    var input= document.createElement( input );
    input.value= user_id;
    input.readonly= True;
    var button= document.createElement( input );
    button.type=  button ;
    button.value=  Message ;

    var chut= document.createElement( div );
    chut.className=  chut ;
    chut.appendChild(log);
    chut.appendChild(textarea);
    chut.appendChild(input);
    chut.appendChild(button);
    document.getElementById( chuts ).appendChild(chut);

    button.onclick= function() {
        alert( Send  +textarea.value+  to  +user_id);
    };

    return chut;
}

您还可以利用便利职能或联合材料框架来缩短该电话的安装时间。

ETA:

I m 此时利用 j作为框架

OK, then consider the jQuery 1.4 creation shortcuts, 例如:

var log= $( <div> , {className:  log });
var input= $( <input> , {readOnly: true, val: user_id});
...

我现在要问的是,我用“JP”来增加一页的内容和事件,因此我无法知道在发出信息之前已经存在的内容。

您可以将<条码>用户_id 留到 Java本的元素节点(或包装物体),以避免将这种信息列入OMM本身,而该密码中所含的特性受到限制。

var chut_lookup= {};
...

function getChut(user_id) {
    var key=  _map_ +user_id;
    if (key in chut_lookup)
        return chut_lookup[key];
    return chut_lookup[key]= addChut(user_id);
}

(_map_ prefix is因为Javagust Object do not t quite work as amap of arbitrary strings. 空洞,在电离层中,有一些<编码>Object 成员名称,将其编成。

问题回答

你们可以这样做:

function sanitize(string) {
  const map = {
       & :  &amp; ,
       < :  &lt; ,
       > :  &gt; ,
       " :  &quot; ,
      " ":  &#x27; ,
      "/":  &#x2F; ,
  };
  const reg = /[&<>" /]/ig;
  return string.replace(reg, (match)=>(map[match]));
}

另见HOWASP 。 XSS Prevention Cheat Sheet

您可以使用一种简单的定期表述,以表明该骗局仅含有允许的特性,例如:

if(id.match(/^[0-9a-zA-Z]{1,16}$/)){
    //The id is fine
}
else{
    //The id is illegal
}

我的榜样只允许字母缩略语,并且用长1至16的语句,你应当加以修改,使之与你使用的各类婴儿相匹配。

顺便说一句,就第6行而言,价值财产丢失了一张quot子,这是你在两层引用时容易犯的错误。

我看不出你的实际数据流,视具体情况而定,这种核对可能根本不需要,或者可能不够。 为了进行适当的安全审查,我们需要更多的信息。

一般来说,建筑在越狱或放风功能中,不会盲目相信。 你们需要确切了解他们所做的工作,你们需要确定,这是你们所需要的。 如果不是你需要的话,那么你自己就能够制定法典,大多数时候,像我给你的那种简单明了的白名单上的reg子一样,你的工作是公正的。

预防特别安全局的以下做法是好的解决办法。

var sanitizeHTML = function (str) {
    return str.replace(/[^w. ]/gi, function (c) {
        return  &#  + c.charCodeAt(0) +  ; ;
    });
};

这方面的一个例子是:

var sanitizeHTML = function (str) {
    return str.replace(/[^w. ]/gi, function (c) {
        return  &#  + c.charCodeAt(0) +  ; ;
    });
};

var app = document.querySelector( #app );
app.innerHTML = sanitizeHTML( <img src="x" onerror="alert(1)"> );
<div id="app">
        
</div>

这一解决办法是

仅补充@SilentImp的评论。 如果需要一种类型的文本......

export function sanitize(input: string) {
  const map: Record<string, string> = {
     & :  &amp; ,
     < :  &lt; ,
     > :  &gt; ,
     " :  &quot; ,
    " ":  &#x27; ,
     / :  &#x2F; ,
  };
  const reg = /[&<>" /]/gi;

  return input.replace(reg, (match) => map[match]);
}




相关问题
selected text in iframe

How to get a selected text inside a iframe. I my page i m having a iframe which is editable true. So how can i get the selected text in that iframe.

How to fire event handlers on the link using javascript

I would like to click a link in my page using javascript. I would like to Fire event handlers on the link without navigating. How can this be done? This has to work both in firefox and Internet ...

How to Add script codes before the </body> tag ASP.NET

Heres the problem, In Masterpage, the google analytics code were pasted before the end of body tag. In ASPX page, I need to generate a script (google addItem tracker) using codebehind ClientScript ...

Clipboard access using Javascript - sans Flash?

Is there a reliable way to access the client machine s clipboard using Javascript? I continue to run into permissions issues when attempting to do this. How does Google Docs do this? Do they use ...

javascript debugging question

I have a large javascript which I didn t write but I need to use it and I m slowely going trough it trying to figure out what does it do and how, I m using alert to print out what it does but now I ...

Parsing date like twitter

I ve made a little forum and I want parse the date on newest posts like twitter, you know "posted 40 minutes ago ","posted 1 hour ago"... What s the best way ? Thanx.

热门标签