Я решил проверить это сам. Переменная $_SERVER['SCRIPT_NAME']
предоставляет путь к запрашиваемому файлу, даже если это индексный файл, без параметров get или чего-либо еще. В документации PHP говорится, что он содержит путь файла, но, похоже, он относится к корню документа, как и PHP_SELF
, но без уязвимости безопасности.
Вот код, который я использовал для проверки этого: https://gist.github.com/dimo414/5484870
Вывод при запросе example.com/?foo=bar
:
__FILE__: /var/www/index.php
PHP_SELF: /index.php
SCRIPT_NAME: /index.php
REQUEST_URI: /?foo=bar
parse_url(REQUEST_URI): /
__FILE__: /var/www/pathtest.php
PHP_SELF: /index.php
SCRIPT_NAME: /index.php
REQUEST_URI: /?foo=bar
parse_url(REQUEST_URI): /
И вывод при запросе example.com/index.php/<strong>XSS</strong>
:
__FILE__: /var/www/index.php
PHP_SELF: /index.php/XSS # note the XSS exploit (this is bold in browser)
SCRIPT_NAME: /index.php # No exploit here
REQUEST_URI: /index.php/%3Cstrong%3EXSS%3C/strong%3E
parse_url(REQUEST_URI): /index.php/%3Cstrong%3EXSS%3C/strong%3E
__FILE__: /var/www/pathtest.php
PHP_SELF: /index.php/XSS
SCRIPT_NAME: /index.php
REQUEST_URI: /index.php/%3Cstrong%3EXSS%3C/strong%3E
parse_url(REQUEST_URI): /index.php/%3Cstrong%3EXSS%3C/strong%3E
Как видите, $_SERVER['SCRIPT_NAME']
всегда возвращает файл, который первоначально обработал запрос, то есть файл в URL, без каких-либо рисков XSS.