$_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 (3)


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.

url on Sunday, March 9, 2025 at 09:37

Hello there! Do you know if they make any plugins
to help with SEO? I'm trying to get my blog to rank for some
targeted keywords but I'm not seeing very good
gains. If you know of any please share. Thanks!

Louislor on Wednesday, March 12, 2025 at 07:14

Волгоград в твоем мобильном!
Измотаны от фальшивок и непроверенной информации? Стремитесь принимать верифицированные и свежие известия непосредственно в Telegram?

Вступайте к сообщество "Новости Волгограда"!

В этом месте тебя ждут: https://telegra.ph/Novosti-Volgograda-Vse-samoe-vazhnoe-v-odnom-meste-03-11

Только верифицированные сведения и оперативные изменения
Детальные отчеты с районов происшествий
Особенные интервью с интересными людьми
Снимки и видео из бытия Волгограда
Возможность поставить вопрос и получить ответ от редакции
Не упустите ничего значимого! Будьте в теме жизни населенного пункта!

Add a comment

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

Comment: