Я много раз видел, как $_SERVER['PHP_SELF'] использовался ; в действии формы.
<form name="form1" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>" >
Дело в том, что вы также можете использовать action="signup" , и это без проблем отправит форму на ту же страницу (если мы находимся на example.com/signup ).
<form method="post" action="signup.php" >
У меня вопрос, почему это почти всегда делается первым способом и какой из них следует использовать.
Вы можете использовать любой из них, но вы должны знать, что если вы используете его
$_SERVER['PHP_SELF']
без каких-либо мер предосторожности, вы можете очень легко получить XSS-атаку.Фактически, вы не должны использовать никакую переменную
$_SERVER
, любую суперглобальную переменную, чтобы отобразить ее на экране без надлежащего экранирования.Давайте посмотрим на простой пример атаки XSS, если вы используете
$_SERVER['PHP_SELF']
невинно.Предположим, эта форма:
Обычный пользователь будет использовать его как следует, набрав в браузере, например:
Нет проблем. Но не все так радужно и есть отдельные личности, которых называют хакерами и не устраивает переход по ссылке, чтобы увидеть красивую форму. Они собираются манипулировать URL-адресом, помещая, например:
Когда хакер введет это в URL-адрес, на сервере будет создан следующий код:
Ну... это не так серьезно, они просто ввели вам простое предупреждение, которое будет отображаться
xss
в диалоговом окне, которое выглядит даже красиво... Проблема в том, что позже хакер введет вам что-то гораздо более серьезное. Когда дверь открыта, внутрь может попасть что угодно, вот в чем проблема.Так
PHP_SELF
зло?Нет, зло тот, кто воспользовался им безответственно. Все суперглобальные значения, которые должны отображаться на экране, должны быть экранированы .
Это использование безопасно:
Когда хакер Пепито попытается обмануть, произойдет следующее:
Выводы
PHP_SELF
это безопасно при правильном использовании. Но мне интересно, стоит ли вообще его использовать, какая разница между этим и вводом имени файла? ИспользованиеPHP_SELF
, казалось бы, является вопросом удобства для написания универсального кода. Может быть, это имеет смысл в приложении с тысячами или миллионами форм? Я бы сказал, что даже не в этом случае, потому что существуют тысячи стратегий работыaction
с формами, даже если их тысячи.Также, размышляя о таких инструментах, как Ajax, можно сказать, что в уважающем себя приложении те страницы, которые перезагружаются для отправки данных на сервер, уже являются частью предыстории и должны исчезнуть. В настоящее время вы можете безопасно запрограммировать все свои формы без
action
или с указанным действием и использовать Ajax для отправки данных на сервер. В этом случае файл, который будет выполняться при отправке формы, будет чем-то другим, а не фактическим файлом, содержащим форму. Мало того, что риски снижены, это очень практичный и элегантный код, который экономит огромные ресурсы.Если у вас нет другого выбора, кроме как продолжать писать доисторический код, лучшей альтернативой будет использование
$_SERVER['SCRIPT_NAME']
.Ссылки