2013-03-29 2 views
2

Я пытаюсь создать очень упрощенную систему обнаружения XSS для системы, которую я сейчас разрабатываю. Система в ее нынешнем виде позволяет пользователям отправлять сообщения с javascript, встроенными в сообщение. Вот то, что я в настоящее время: -Обнаружить, если строка содержит теги javascript, используя jQuery/JavaScript

var checkFor = "<script>";
alert(checkFor.indexOf("<script>") !== -1);

Это на самом деле не работает, что хорошо на всех. Мне нужно написать код, который содержит массив, который содержит термины, которые я ищу. [e.g - "<script>","</script>","alert("]

Любые предложения относительно того, как это можно достичь с помощью JavaScript/jQuery.

Спасибо, что проверили это. Большое спасибо :)

+1

Вместо того, чтобы вы создать упрощенную систему обнаружения XSS, почему бы не использовать сложная система обнаружения XSS, сделанная кем-то еще? –

+0

@ExplosionPills - Спасибо за ответ. Не могли бы вы порекомендовать один? –

ответ

2

Замена символов - очень хрупкий способ избежать XSS. . (Есть десятки способов получить < в без ввода символа - как &#60; Вместо HTML-кодирование данных я использую эти функции:

var encode = function (data) { 
    var result = data; 
    if (data) { 
     result = $("<div />").html(data).text(); 
    } 
}; 
var decode = function (data) { 
    var result = data; 
    if (data) { 
     result = $("<div />").text(data).html(); 
    } 
}; 
+0

Вы прокомментировали, что мой ответ будет «запускать» теги потому что он присваивает innerHTML, но ваш ответ делает то же самое. Это вряд ли операция кодирования/декодирования, так как любые теги будут удалены при получении данных, результат * декодирования * не гарантированно будет таким же, как то, что было передано * encode *. – RobG

+0

Интригуя, вы правы. Несмотря на то, что рассматриваемый div находится не в DOM, он, как правило, запускает «данные», переданные в кодировку. Это довольно большая неудача. И вы правы, есть строки, которые вы могли бы передать в кодировку, которая не обеспечивала бы безопасный круглый путь с декодированием. Наверное, вы не хотите упорствовать в этих строках. – robrich

+0

Я наткнулся на хорошую ссылку для этой техники: http: // stackoverflow.com/questions/1219860/javascript-jquery-html-encoding, который также отмечает, что в оба конца не будут получены одинаковые результаты, но, скорее всего, вы в порядке с этим. – robrich

-1

Наиболее эффективным способом предотвращения XSS атак является заменой всех <,> и & символы с &lt;, &gt; и &amp;.

В OWASP есть библиотека javascript. Я еще не работал с этим, так что не могу ничего рассказать о качестве. Вот ссылка: https://www.owasp.org/index.php/ESAPI_JavaScript_Readme

0

Как взрывательные таблетки, если вы ищете межсайтовые эксплойты, вам, вероятно, лучше всего найти тот, который уже был написан, или тот, кто может написать его для вас.

В любом случае, чтобы ответить на вопрос, регулярные выражения не подходят для разбора разметки. Если у вас есть HTML-парсер (на стороне клиента легко, сервер немного сложнее) можно вставить текст в качестве innerHTML в качестве нового элемента, то увидеть, если есть какие-либо дочерние элементы:

function mightBeMarkup(s) { 
    var d = document.createElement('div'); 
    d.innerHTML = s; 
    return !!(d.getElementsByTagName('*').length); 
} 

Конечно, есть все еще может быть разметкой в ​​тексте, просто это недействительно, поэтому не создаются элементы. Но в сочетании с некоторым другим текстом это может быть допустимая разметка.

+0

Это правильно определит, что в вашей строке были теги, но они также будут запускать их в первую очередь. – robrich

+0

Это не будет теги «run». Присвоение свойству innerHTML не выполняет скрипты, которые, как представляется, являются главной проблемой. Элементы с атрибутом src также не должны быть проблемой. – RobG