2014-10-30 1 views
1

Общей методикой предотвращения атак XSS является кодирование ненадежных данных перед их отображением на HTML-странице. Внутри страницы есть разные контексты, в которые он может появиться, каждый требует различной кодировки.Можно ли использовать выходную кодировку для XSS на стороне клиента?

Кодирование ответов на стороне сервера не имеет смысла, потому что на этом уровне мы не знаем, где на странице HTML появятся данные.

Так что удобнее и разумнее кодировать на стороне клиента. Вопрос в том, безопасен ли он. При первом показе звучит небезопасно, потому что злоумышленник может модифицировать клиентский код (скажем, JavaScript). Но когда вы думаете об этом, измененный код будет доступен только браузеру атакующего. Эти изменения не повлияют на других посетителей веб-сайта.

Является ли это еще безопасным или я что-то упускаю?

ответ

3

Теоретически кодирование на стороне клиента не более опасно, чем кодирование на стороне сервера. Ключом к тому, чтобы обеспечить его безопасность, является то, насколько вы строги в том, что вы делаете подходящую кодировку во всех местах, где отображаются ваши данные. Вы, безусловно, можете создать хорошую реализацию для безопасного предоставления пользователям данных на стороне клиента и сервера. Практически, хотя недостатком реализации клиентской части выходного кодирования является то, что потенциальный злоумышленник может легко проверить ваш исходный код на наличие недостатков. Это означает, что если в вашей реализации на стороне клиента есть ошибки, это будет легче найти, чем сказать на стороне сервера (при условии, что система с закрытым исходным кодом). Если вы разрабатываете программное обеспечение с открытым исходным кодом, то этот момент спорный.

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

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

2

Борьба с XSS на стороне сервера не так сложна, как вы думаете. Цель состоит в том, чтобы знать, какой символ вы должны кодировать в каком контексте.

В основном существует 4 различных контекста, которые мы должны учитывать в XSS.

HTML Контекст

Если вы хотите получить XSS в качестве нападающего в этом контексте нужно < и> символов. Поэтому для кодирования только эти два символа могут быть решены XSS на основе контекста.

/** 
    * XSS protection function for HTML context only 
    * @usecases 
    * <title>use this function if output reflects here or as a content of any HTML tag.</title> 
    * e.g., <span>use this function if output reflects here</span> 
    * e.g., <div>use this function if output reflects here</div> 
    * @description 
    * Sanitize/Filter <and> so that attacker can not leverage them for JavaScript execution. 
    * @author Ashar Javed 
    * @Link https://twitter.com/soaj1664ashar 
    * @demo http://xssplaygroundforfunandlearn.netai.net/final.html 
    */ 
    function htmlContextCleaner($input) { 
     $bad_chars = array("<", ">"); 
     $safe_chars = array("&lt;", "&gt;"); 
     $output = str_replace($bad_chars, $safe_chars, $input); 
     return stripslashes($output); 
    } 

случаи Javascript Контекст

Наиболее часто используют, как следующие коды.

<script> var name = 'USERINPUTISHERE';</script> 

или

<script> var name = "USERINPUTISHERE";</script> 

или

<button type="submit" onclick="return callSomeFunction('USERINPUTHERE')"> 

Для того, чтобы предотвратить приложение от JS Context основе атаки XSS. Вам нужно закодировать 6 конкретных символов. Пожалуйста, прочитайте следующее описание, чтобы понять аспект атаки для контекста скрипта.

/** 
* XSS protection function for script context only 
* @usecases 
* @double quoted case e.g., 
* <script> var searchquery = "use this function if output reflects here"; </script> 
* @single quoted case e.g., 
* <script> var searchquery = 'use this function if output reflects here'; </script> 
* @description 
* Sanitize/Filter meta or control characters that attacker may use to break the context e.g., 
* "; confirm(1); " OR '; prompt(1); // OR </script><script>alert(1)</script> 
* \ and % are filtered because they may break the page e.g., \n or %0a 
* & is sanitized because of complex or nested context (if in use) 
* @author Ashar Javed 
* @Link https://twitter.com/soaj1664ashar 
* @demo http://xssplaygroundforfunandlearn.netai.net/final.html 
*/ 
function scriptContextCleaner($input) { 
    $bad_chars = array("\"", "<", "'", "\\\\", "%", "&"); 
    $safe_chars = array("&quot;", "&lt;", "&apos;", "&bsol;", "&percnt;", "&amp;"); 
    $output = str_replace($bad_chars, $safe_chars, $input); 
    return stripslashes($output); 
} 

Атрибут Контекст

Эти коды могут быть примером для контекста атрибута.

<input name="fname" value="USERINPUTISHERE"> 

Или одинарная казначейская форма примера образца.

<input name='fname' value='USERINPUTISHERE'> 

В принципе, нам нужно кодировать очень интересные символы, чтобы обеспечить его безопасность. Нам нужно также закодировать back-tick, чтобы создать безопасный контекст для старой версии IE. Прочтите следующие описания и коды.

/** 
    * XSS protection function for an attribute context only 
    * @usecases 
    * @double quoted case e.g., 
    * <div class="use this function if output reflects here">attribute context</div> 
    * In above example class attribute have been used but it can be any like id or alt etc. 
    * @single quoted case e.g., 
    * <input type='text' value='use this function if output reflects here'> 
    * @description 
    * Sanitize/Filter meta or control characters that attacker may use to break the context e.g., 
    * "onmouseover="alert(1) OR 'onfocus='confirm(1) OR ``onmouseover=prompt(1) 
    * back-tick i.e., `` is filtered because old IE browsers treat it as a valid separator. 
    * @author Ashar Javed 
    * @Link https://twitter.com/soaj1664ashar 
    * @demo http://xssplaygroundforfunandlearn.netai.net/final.html 
    */ 
    function attributeContextCleaner($input) { 
     $bad_chars = array("\"", "'", "``"); 
     $safe_chars = array("&quot;", "&apos;", "&grave;"); 
     $output = str_replace($bad_chars, $safe_chars, $input); 
     return stripslashes($output); 
    } 

Стиль Контекст

Как злоумышленник, получив XSS со стилем контексте, как правило, связанные с IE. Повторите следующие описания и коды.

/** 
* XSS protection function for style context only 
* @usecases 
* @double quoted case e.g., 
* <span style="use this function if output reflects here"></span> 
* @single quoted case e.g., 
* <div style='use this function if output reflects here'></div> 
* OR <style>use this function if output reflects here</style> 
* @description 
* Sanitize/Filter meta or control characters that attacker may use to execute JavaScript e.g., 
* (is filtered because width:expression(alert(1)) 
* & is filtered in order to stop decimal + hex + HTML5 entity encoding 
* < is filtered in case developers are using <style></style> tags instead of style attribute. 
* < is filtered because attacker may close the </style> tag and then execute JavaScript. 
* The function allows simple styles e.g., color:red, height:100px etc. 
* @author Ashar Javed 
* @Link https://twitter.com/soaj1664ashar 
* @demo http://xssplaygroundforfunandlearn.netai.net/final.html 
*/ 
function styleContextCleaner($input) { 
    $bad_chars = array("\"", "'", "``", "(", "\\\\", "<", "&"); 
    $safe_chars = array("&quot;", "&apos;", "&grave;", "&lpar;", "&bsol;", "&lt;", "&amp;"); 
    $output = str_replace($bad_chars, $safe_chars, $input); 
    return stripslashes($output); 
} 

Заключение

Борьба с XSS на стороне сервера кодирования может быть легко, если вы знаете, какие символы должны быть закодированы в их особом контексте. Есть только одно осложнение, когда вы используете обратный тик (`) как разделитель атрибутов, например, следующий.

<input name=`fname` value=`USERINPUTHERE`> 

Эти функции не могут защитить ваши приложения. Но я не видел ни одного примера реальной жизни для этого случая !!!

Подход, описанный выше, проверен на десятки хакеров/исследователей безопасности, и никто его не эксплуатирует. (Детали: https://twitter.com/soaj1664ashar/status/478939711667712000). Также Symphonycms использует этот подход для предотвращения XSS (также все примеры примеров захвачены из их репо. https://github.com/symphonycms/xssfilter/blob/master/lib/xss.php)

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

DOMPurify

DOMPurify является DOM-только, супер-быстрый, супер-толерантный XSS дезинфицирующее для HTML, MathML и SVG. Он написан на JavaScript и работает во всех современных браузерах (Safari, Opera (15+), Internet Explorer (9+), Firefox и Chrome - а также почти все, что угодно, используя Blink или WebKit). Он не разбивается на IE6 или другие устаревшие браузеры. Он просто ничего не делает.

DOMPurify написан людьми безопасности, которые имеют обширный фон в веб-атаках и XSS. Не бойся.

Дополнительную информацию можно найти здесь (https://github.com/cure53/DOMPurify)

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

  • Нет связанных вопросов^_^