2013-02-08 2 views
2

У меня есть некоторые функции javascript на моем сайте, но я не знаю, можно ли их использовать.является моей безопасной функцией xss?

вот мой код:

// works like PHP's $_GET 
function get(name){ 
    name=name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]"); 
    regexS="[\\?&]"+name+"=([^&#]*)"; 
    regex=new RegExp(regexS); 
    results=regex.exec(window.location.href); 
    if(results==null) 
     return ''; 
    return results[1]; 
} 

// and here is my anti xss filter 
var param = unescape(decodeURI(get("q"))); 
param = param.replace(/<(.*?)>/gi, ""); 
someElement.innerHTML = param; 

Можно ли обойти эти фильтры?

+0

Это может работать в той или иной степени с помощью JS, но только до точки, в целом с любой стороны клиента, далека от доказательства или безопасности. При этом я не стал бы полагаться на 100% на любую защиту на стороне клиента. Если ваши инъекции получают переменные в innerHTML элемента, то вы хотите быть еще более осторожными, потому что кто-то может легко вводить код на вашу страницу, а затем использовать этот код, чтобы наложить на ваш сервер больше удовольствия. – chris

+3

Я собираюсь сказать : нет, это не безопасно и просто добавляет ложное чувство безопасности, как «magic_quotes». Основная проблема с подходом «фильтр» заключается в том, что он не может быть правильным решением - правильным решением является безопасное применение данных на сайте использования *. То есть, если innerHTML не должен содержать HTML, * HTML-encode * он на сайте использования, но затем * зачем * использовать innerHTML для начала? – 2013-02-08 20:07:24

+2

Вот пример счетчика: '? Q = alert ('XSS')'. – Gumbo

ответ

0

Нет, но если вы имитировать режим многострочного в вашей второй последней строке, как это:

param = param.replace(/<([\s\S]*?)>/gi, ""); 

ваш пример код будет безопасным, как это. Самый большой недостаток в вашем примере кода - innerHTML, когда вы вообще не хотите добавлять HTML. Поэтому вместо того, чтобы использовать innerHTML и пытаясь отфильтровать HTML, вы должны использовать createTextNode, и вам больше не придется беспокоиться о XSS. Так держать вашу get функцию, если вам это нравится, и использовать значения параметров, как это (взято из MDN):

var param = unescape(decodeURI(get("q"))); 
var text = document.createTextNode(param); 
document.getElementById(someElement).appendChild(newtext); 

Если вы используете JQuery, вы можете использовать .text() функцию, которая сама использует createTextNode.

3

Не пытайтесь найти XSSes по пути в ваше приложение. Ваша программа может трансформировать данные внутренне таким образом, чтобы любой создаваемый фильтр, вероятно, был обходным.

Вместо этого примените надлежащее кодирование HTML данных по пути из вашего приложения. Таким образом, вы избегаете уязвимостей.

Смежные вопросы