Могу ли я взять большой риск для безопасности, доверяя содержимому массива переменных $ _SERVER, чтобы получить имя файла php с помощью $ _SERVER ['PHP_SELF']?
Многие, но не все переменные $ _SERVER контролируются атакующем . Например, $_SERVER['SCRIPT_NAME']
безопасен там, где $_SEVER['PHP_SELF']
представляет собой переменную опасную переменную и часто является источником xss:
<?php echo $_SEVER['PHP_SELF']; ?>
PoC:
http://localhost/self.php/<script>alert(/xss/)</script>
Легко видеть эту уязвимость в действии, глядя на phpinfo .
Из руководства php.net :
Записи в этом массиве создаются веб-сервером. Нет никакой гарантии, что каждый веб-сервер предоставит любой из них; серверы могут опускать некоторые или предоставлять другим, не перечисленным здесь.
Таким образом, если вам известны все пользователи, у которых есть доступ к конфигурации сервера изменений (и все сценарии в сеансе, которые могут изменять содержимое переменной), вы можете быть разумно уверены в данных переменной $_SERVER
.
Для защиты этой переменной нет специального механизма. Вы можете написать ему, как можете, любой другой переменной. Поэтому вам необходимо защитить его от несанкционированного доступа, как и любую другую переменную (отключить register_globals, избежать переменных переменных и т. Д.). Тогда вы можете доверять этому.
В качестве обходного пути вы можете определить свои собственные константы в начале вашей программы:
define('SCRIPT_FILENAME',$_SERVER['SCRIPT_FILENAME']);
и использовать предопределенные константы, если они доступны, например __FILE__
.
Совсем нет, это не может фактически быть риском вообще, пока вы не используете данные от пользователя. То есть, используйте один из них:
echo __FILE__; // is the same as echo $_SERVER["SCRIPT_FILENAME"]; echo $_SERVER["SCRIPT_NAME"]; // SCRIPT_NAME contains just the path