У вас есть пара вопросов, о которых никто не упомянул.В целом, ваши проблемы:
- Во-первых, вы не должны использовать
$_SERVER['PHP_SELF']
, поскольку это не очень безопасно. - Во-вторых, выиспользуя обратные кавычки вместо одинарных кавычек:
$_SERVER[’PHP_SELF’]
должно быть $_SERVER['PHP_SELF']
- В-третьих, ваш HTML не работает.
Рассмотрим код, который вы указали:
class="action="<?php echo $_SERVER[’PHP_SELF’];?>" id="uploadform"
Указывает атрибут класса вашей формы как action=
и оставляет случайный фрагмент php, сопровождаемый осиротевшей двойной кавычкой перед атрибутом id
.
Правильная спецификация <form>
должнабыть:
<form method="post" action="" id="uploadform" enctype="multipart/form-data">
ОБНОВЛЕНИЕ
В соответствии с просьбой, здесь приведено еще одно объяснение того, почему $_SERVER['PHP_SELF']
уязвим для XSS-атак ...
Во-первых, поймите, что пользователь может манипулировать $_SERVER['PHP_SELF']
.Вы можете спросить, как это возможно?В конце концов, для сценария, расположенного в /mypage.php
, не должно $_SERVER['PHP_SELF']
всегда равняться /mypage.php
?
Не обязательно.
Apache (и, возможно, другие серверы, которых у меня нетопыт работы с) использовать функцию обратного просмотра с URL-адресами, которая позволяет просматривать «назад» URL-адрес для совпадений файлов, если полный URL-адрес не соответствует конкретному ресурсу.Например, следующий адрес найдет совпадение в файле mypage.php, если mypage.php
является фактически читаемым файлом в webroot, а не именем каталога:
http://domain.com/mypage.php/pretty-url << --- apache обслуживает /mypage.php</p>
В этот момент вы можете подумать: «Это хорошо, но как это уязвимо для XSS?»
I 'Я рад, что ты спросил.Рассмотрим следующий сценарий:
- У вас есть форма на
/mypage.php
, которая использует $_SERVER['PHP_SELF']
в своем атрибуте действия. - Злоумышленник решает поместить следующее в свою адресную строку:
http://domain.com/mypage.php/%22%3E%3Cscript%3Ealert('pwned')%3C/script%3E
Внезапно HTML, который вы указали как:
<form action="<?php echo $_SERVER['PHP_SELF']; ?>">
Теперь отображается так:
<form action="/mypage.php/"><script>alert('pwned')</script>
Это довольно безобидный пример, потому что все, что он делает, - это всплывающее предупреждение с надписью "pwned".Тем не менее, гнусный человек может использовать подобный код javascript, чтобы делать гораздо более неприятные вещи.
Вы можете избежать этой конкретной проблемы, используя htmlentities
в вашей переменной $_SERVER['PHP_SELF']
, однако IMHO в этом сценарии лучше всего всего этого избежать.