$_SERVER['PHP_SELF'] and cross-site scripting

Monday, May 20, 2013


It's tempting to assume that PHP's $_SERVER array mostly contains fields out of the reach of an attacker, since these are "server" variables. However, that's not always the case; in particular, the seemingly innocuous PHP_SELF field can be a vector for cross-site scripting.

For example, consider the following foo.php:

<form method="POST" action="<?php echo $_SERVER['PHP_SELF'] ?>">
    <!-- ...form elements... -->
</form>

If I visit http://www.example.com/foo.php, $_SERVER['PHP_SELF'] will be /foo.php and everything will work correctly.

But what if I visit http://www.example.com/foo.php/"><script>alert('hello');</script> instead? Then the rendered HTML will be:

<form method="POST" action="/foo.php/"><script>alert('hello');</script>">
    <!-- ...form elements... -->
</form>

This allows injection of arbitrary script running under the host site's context, also known as XSS. Two ways to fix this are:

  • Use $_SERVER['SCRIPT_NAME'] instead of $_SERVER['PHP_SELF']. The former is the name of the actual script file and can't normally be manipulated by an attacker.
  • Use htmlspecialchars(), which by default will escape double-quotes and prevent a user-supplied string from breaking out of an HTML attribute context.

By the way, this was pretty surprising behavior to me for two reasons:

  • The documentation of PHP_SELF is misleading: The first sentence says:

    The filename of the currently executing script, relative to the document root.

    It seems odd that PHP would refer to something like /foo.php/"><script>alert('hello');</script> as a "filename."
  • It's pretty bizarre default behavior that PHP will execute /foo.php for a request of /foo.php/bar/baz.

Tags: php, xss, security | Posted at 11:13 | Comments (5)


Comments

David Annis on Wednesday, June 25, 2014 at 06:32

I have used the fact that php will execute /foo.php from a request that contains /foo.php/bar to make search engine friendly URLs because many search engines will not index both wheretodrink.php?answer=bar and wheretodrink.php?answer=home because they fear an infinite set of URLs.

lopagyLal on Monday, August 3, 2026 at 22:01

Если вы ищете простой способ подработки в интернете без вложений и специальных навыков, стоит обратить внимание на сервис SerfBest — платформу для выполнения несложных онлайн-заданий. Суть работы проста: вы выполняете короткие задачи — посещаете сайты через поисковик, проходите регистрации — и получаете за это оплату. Вознаграждение варьируется от нескольких копеек до ста рублей в зависимости от сложности, а среднее задание занимает около минуты и приносит порядка двух рублей. Подробности и регистрация доступны на <a href=https://serfbest.ru/>https://serfbest.ru/</a>, где можно сразу приступить к заработку. Приятным бонусом служит реферальная программа: приглашая новых пользователей, вы получаете процент от их заработка, причём эти средства начисляются платформой и не списываются у приглашённых. Конечно, речь не идёт о больших суммах, однако при регулярной работе и совмещении с аналогичными ресурсами доход становится ощутимым и стабильным.

wobiyhPoese on Monday, August 3, 2026 at 22:48

Быстрая и удобная публикация новостей — задача, которую ежедневно решают пресс-службы, медиа-агентства и корпоративные коммуникаторы по всей стране. Сервис AUTOMU.RU предлагает именно то, чего не хватает профессионалам медиарынка: мгновенное размещение материалов с автоматической дистрибуцией в информационное пространство. Платформа <a href=https://automu.ru/>https://automu.ru/</a> позволяет компаниям, государственным структурам и их представителям публиковать пресс-релизы, новости и аналитические материалы без бюрократических проволочек. Удобный интерфейс, прозрачные условия и оперативная поддержка редакции делают этот сервис надёжным инструментом для тех, кто ценит скорость и охват в работе со СМИ.

ceduhstHorgo on Tuesday, August 4, 2026 at 04:06

Канал MIDNIGHT VEIL на платформе <a href=https://www.youtube.com/@808MusicChannel>https://www.youtube.com/@808MusicChannel</a> представляет собой уникальное музыкальное пространство для ценителей атмосферного звучания и глубоких эмоций. Здесь собрана коллекция треков, идеально подходящих для ночных размышлений, долгих поездок и моментов уединения. Канал специализируется на liquid drum and bass, atmospheric electronic music и ambient композициях, создавая неповторимую звуковую палитру городских пейзажей и ночной меланхолии. С аудиторией в 173 подписчика и растущей библиотекой из 28 видео, проект активно развивается, предлагая качественный контент для тех, кто ищет музыку с душой и настроением.

lanacurAsync on Tuesday, August 4, 2026 at 04:33

BIN (Bank Identification Number) — это первые шесть цифр номера банковской карты, по которым можно мгновенно определить банк-эмитент, страну выпуска, платёжную систему и тип карты. Такая проверка полезна при онлайн-покупках, верификации платежей и защите от мошенничества. Подробный разбор темы с удобным онлайн-инструментом доступен на сайте <a href=https://kreditnaya-karta.com/bin-karty-i-bin-checker-chto-eto-takoe-i-kak-opredelit-bank-i-stranu-po-nomeru-karty/>https://kreditnaya-karta.com/bin-karty-i-bin-checker-chto-eto-takoe-i-kak-opredelit-bank-i-stranu-po-nomeru-karty/</a> — здесь вы узнаете, как работает BIN-checker и какую информацию он выдаёт. Важно помнить, что BIN не раскрывает персональные данные владельца: ни имя, ни баланс, ни CVV-код остаются недоступны.

Add a comment

Name:
Email: (optional, not displayed to public)
URL: (do not fill this in — leave blank!)

Comment: