Обеспечил ли я все основы безопасности при отображении серверной переменной на странице?
Вопрос
С формами, которые я всегда использовал
<form method="post" action="<?php echo strip_tags($_SERVER['REQUEST_URI']); ?>">
Чтобы мои формы отправлялись сами себе.
я использую striptags()
на случай, если кто-то ссылается на:
http://www.mysite.com/page-with-form.php?bla="><script src="http://www.nasty.com/super-nasty.js"></script><a href="#
Охватил ли я все основы для защиты от XSS-атак, или мне следует использовать более белый список, скажем, регулярное выражение, которое допускает только буквенно-цифровые символы, косую черту, вопросительный знак, знак равенства, круглые скобки и т. д.?
Спасибо!
Решение
Используйте htmlspecialchars
вместо strip_tags
.
Другие советы
Если вы хотите сослаться на ту же схему / хост / путь, просто выполните действие = "? " должно хватить.
Согласно http://tools.ietf.org/html/rfc3986#section-4.2 а> р>
это действительный относительный URI. relative-ref = relative-part [ "?" query ] [ "#" fragment ]
relative-part = "//" authority path-abempty
/ path-absolute
/ path-noscheme
/ path-empty
Отправьте форму самому себе, отправив ее сюда:
$_SERVER["PHP_SELF"]
Эта глобальная переменная выведет текущую страницу.Если нет причины, по которой вам нужна вся строка запроса вместе с ней?
РЕДАКТИРОВАТЬ
Поскольку, как отметил VolkerK в комментариях, даже PHP_SELF
уязвим, вы можете написать свою собственную небольшую переменную на основе PHP_SELF
и выделите остальную часть URI, которая, как вы знаете, не является частью вашей страницы.Что-то вроде этого:
$file_ext = '.php'; //knowing what file extension your URI is
$page_on = $_SERVER["PHP_SELF"]; //grab this page, with all that junk
$page_huh = explode($file_ext, $page_on); //blow it apart based on file ext
$page_on = $page_huh[0].$file_ext; //attach the leg back onto the URI
echo $page_on;
Если ваш striptags()
лишает только тегов (символы между " < " и " > " включая угловые скобки) кто-то еще может внедрить JavaScript:
http://www.mysite.com/page-with-form.php?bla=" onsubmit="return function(){ /*nasty code here*/ }()" style="
Лучший белый список всех возможных метасимволов в HTML, Javascript и CSS (т.е. угловые скобки, скобки, скобки, точки с запятой, двойные кавычки, одинарные кавычки и т. д.).
Если вы хотите, чтобы форма отправлялась сама себе, просто оставьте действие пустым, например.
<form action="" method="POST">
...
</form>