2012-03-28 2 views
13

내 HTML 5 애플리케이션의 사용자가 양식에 이름을 입력 할 수 있으며이 이름은 다른 곳에 표시됩니다. 좀 더 구체적으로, 일부 HTML 요소의 innerHTML이됩니다.Dojo Toolkit : HTML 문자열을 이스케이프 처리하는 방법은 무엇입니까?

문제는 양식에서 올바른 HTML 마크 업 (예 : 일종의 HTML 삽입)을 입력하면 악용 될 수 있다는 것입니다.

사용자 이름은 클라이언트 측에만 저장되고 표시되므로 결국 사용자 자신이 영향을받는 유일한 사람이지만 여전히 엉성한 상태입니다.

Dojo의 요소 innerHTML에 삽입하기 전에 문자열을 이스케이프 (escape)하는 방법이 있습니까? Dojo는 실제로 그러한 기능 (dojo.string.escape())을 가지고 있지만 버전 1.7에는 존재하지 않습니다.

감사합니다.

답변

16
dojox.html.entities.encode(myString); 
+0

매력처럼 작동하며 바퀴를 다시 만들 필요가 없습니다. 감사! –

0

확인 dojo.replace의 예 :

require(["dojo/_base/lang"], function(lang){ 
    function safeReplace(tmpl, dict){ 
    // convert dict to a function, if needed 
    var fn = lang.isFunction(dict) ? dict : function(_, name){ 
     return lang.getObject(name, false, dict); 
    }; 
    // perform the substitution 
    return lang.replace(tmpl, function(_, name){ 
     if(name.charAt(0) == '!'){ 
     // no escaping 
     return fn(_, name.slice(1)); 
     } 
     // escape 
     return fn(_, name). 
     replace(/&/g, "&"). 
     replace(/</g, "&lt;"). 
     replace(/>/g, "&gt;"). 
     replace(/"/g, "&quot;"); 
    }); 
    } 
    // that is how we use it: 
    var output = safeReplace("<div>{0}</div", 
    ["<script>alert('Let\' break stuff!');</script>"] 
); 
}); 

출처 : http://dojotoolkit.org/reference-guide/1.7/dojo/replace.html#escaping-substitutions

0

내가 다른 라이브러리가이 기능을 구현하는 방법을 찾기 위해 노력하고 나는 다음 Mootools의에서의 아이디어를 훔친 :

var property = (document.createElement('div').textContent == null) ? 'innerText': 'textContent'; 
elem[property] = "<" + "script" + ">" + "alert('a');" + "</" + "script" + ">"; 

MooTools에 따르면 HTML을 이스케이프 처리 할 수있는 innerText 또는 textContent 속성이 있습니다.

5

Dojo에는 HTML 이스케이프 용 모듈 dojox/html/entities이 있습니다. 불행하게도 the official documentation은 여전히 ​​1.7 이전의 비 AMD 사례만을 제공합니다. 여기

는 AMD와 그 모듈을 사용하는 방법의 예이다 :

var str = "<strong>some text</strong>" 
require(['dojox/html/entities'], function(entities) { 
var escaped = entities.encode(str) 
console.log(escaped) 
}) 

출력 :

도장 1.10로

&lt;strong&gt;some text&lt;/strong&gt;

0

이스케이프 기능 정지의 일부 문자열 모듈. 여기

http://dojotoolkit.org/api/?qs=1.10/dojo/string

은 간단한 템플릿 시스템으로 사용할 수있는 방법입니다.

require([ 
    'dojo/string' 
], function(
    string 
){ 
    var template = '<h1>${title}</h1>'; 
    var message = {title: 'Hello World!<script>alert("Doing something naughty here...")</script>'} 
    var html = string.substitute(
     template 
     , message 
     , string.escape 
    ); 
}); 
관련 문제