PHP XSS санация - PullRequest
       43

PHP XSS санация

7 голосов
/ 13 мая 2011

Вопросы:

Каковы наилучшие функции safe1 (), safe2 (), safe3 () и safe4 (), чтобы избежать XSS для страниц в кодировке UTF8?Это также безопасно во всех браузерах (особенно IE6)?

<body><?php echo safe1($xss)?></body>

<body id="<?php echo safe2($xss)?>"></body>

<script type="text/javascript">
  var a = "<?php echo safe3($xss)?>";
</script>

<style type="text/css">
  .myclass {width:<?php echo safe4($xss)?>}
</style>

.

Многие люди говорят, что абсолютное лучшее, что можно сделать, это:

// safe1 & safe2
$s = htmlentities($s, ENT_QUOTES, "UTF-8");

// But how would you compare the above to:
//    https://github.com/shadowhand/purifier
// OR http://kohanaframework.org/3.0/guide/api/Security#xss_clean
// OR is there an even better if not perfect solution?

.

// safe3
$s = mb_convert_encoding($s, "UTF-8", "UTF-8");
$s = htmlentities($s, ENT_QUOTES, "UTF-8");

// How would you compare this to using using mysql_real_escape_string($s)?
// (Yes, I know this is a DB function)
// Some other people also recommend calling json_encode() before passing to htmlentities
// What's the best solution?

.

Существует множество сообщений о PHP и XSS.Большинство просто говорят «использовать HTMLPurifier» или «использовать htmlspecialchars», или ошибаются.Другие говорят, что используют OWASP - но это ОЧЕНЬ медленно.Некоторые из хороших постов, с которыми я столкнулся, перечислены ниже:

Сохраняют ли htmlspecialchars и mysql_real_escape_string мой PHP-код в безопасности от инъекций?

Предупреждения XSS Me - настоящиеПроблемы с XSS?

CodeIgniter - зачем использовать xss_clean

Ответы [ 2 ]

4 голосов
/ 13 мая 2011

safe2() ясно htmlspecialchars()

Вместо safe1() вы действительно должны использовать HTMLPurifier для очистки полных объектов HTML. Он удаляет нежелательные атрибуты, теги и, в частности, все, что связано с JavaScript. Да, это медленно, но оно охватывает все мелкие крайние случаи (даже для более старых версий IE), которые допускают безопасное повторное использование фрагмента HTML пользователя. Но проверьте http://htmlpurifier.org/comparison для альтернатив. - Если вы действительно хотите отображать только необработанный текст пользователя (без отфильтрованного html), тогда htmlspecialchars(strip_tags($src)) будет работать нормально.

safe3() кричит регулярное выражение. Здесь вы действительно можете применить белый список к тому, что вы действительно хотите:

var a = "<?php echo preg_replace('/[^-\w\d .,]/', "", $xss)?>";

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


Это также безопасно во всех браузерах (особенно IE6)?

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

3 голосов
/ 13 мая 2011

http://php.net/htmlentities обратите внимание на раздел о необязательном третьем параметре, который принимает кодировку символов. Вы должны использовать это вместо mv_convert_encoding. Пока сам файл php сохраняется с кодировкой utf8, которая должна работать.

htmlentities($s, ENT_COMPAT, 'UTF-8');

Что касается введения переменной непосредственно в javascript, вы можете вместо этого поместить содержимое в скрытый html-элемент где-то еще на странице и извлечь содержимое из dom, когда вам это нужно.

Упомянутые вами очистители используются, когда вы действительно хотите отобразить HTML, который отправил пользователь (например, разрешить браузеру отображать). Использование htmlentities закодирует все так, что символы будут отображаться в пользовательском интерфейсе, но ни один из фактического кода не будет интерпретироваться браузером. Что вы хотите сделать?

...