Как «доказательство несанкционированного доступа» является переменной $ _SERVER в php?

Могу ли я взять большой риск для безопасности, доверяя содержимому массива переменных $ _SERVER, чтобы получить имя файла php с помощью $ _SERVER ['PHP_SELF']?

Solutions Collecting From Web of "Как «доказательство несанкционированного доступа» является переменной $ _SERVER в php?"

Многие, но не все переменные $ _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