PHP表单 - 未定义的常量'PHP_SELF'

Tom*_*cer 0 html php forms self submit

我有一个联系表单,它在我的服务器上托管时工作正常,但是当我将它上传到我的客户端服务器时,我遇到了问题.请查看此处的页面:http://www.conceptonegfx.com/contact.php

我在表单顶部收到以下错误

注意:使用未定义的常量'PHP_SELF' - 在第42行的E:\ Domains\c\conceptonegfx.com\user\htdocs\fns.php中假定为''PHP_SELF''

注意:未定义的索引:第42行的E:\ Domains\c\conceptonegfx.com\user\htdocs\fns.php中的'PHP_SELF'"id ="uploadform"enctype ="multipart/form-data">

以下是fns.php上的问题:

 <?php
//start session
 if(!isset($_SESSION)) 
 { 
 session_start(); 
 }  


  // prints form
   function print_form(){
   ?>


<form method="post" class="action="<?php echo $_SERVER[’PHP_SELF’];?>" id="uploadform" enctype="multipart/form-data">
<p><label for="namefrom">Name <span class="required">*</span></label>
<input name="namefrom" id="namefrom" type="text" class="field" value="<?= $_SESSION['myForm']['namefrom']; ?>" tabindex="1"/></p>

<p><label for="emailfrom">Email <span class="required">*</span></label>
<input name="emailfrom" id="emailfrom" type="text" class="field" value="<?= $_SESSION['myForm']['emailfrom']; ?>" tabindex="3"/></p>

<p><label for="phone">Phone</label>
<input name="phone" id="phone" type="text" class="field" value="<?= $_SESSION['myForm']['phone']; ?>" tabindex="4"/></p>

<p><label for="message">Message <span class="required">*</span></label>
<textarea name="comments" id="comments" rows="10" cols="35" align="left" class="field" tabindex="6"><?= $_SESSION['myForm']['comments']; ?></textarea></p>

<p><label for="attachment">File Upload<br /></label>
<input name="attachment" id="attachment" type="file" tabindex="7">

<p><input align="left" type="submit" name="submit" id="submit" value="Send Email"  tabindex="8"/></p>
<p><input type="hidden" name="submitted"  value="true" /></p>
</form> 
Run Code Online (Sandbox Code Playgroud)

Izn*_*ood 6

不确定这是问题还是复制粘贴的东西,但是:

’PHP_SELF’
Run Code Online (Sandbox Code Playgroud)

应该真的

'PHP_SELF'
Run Code Online (Sandbox Code Playgroud)

看一下手册

从rdlowrey的帖子编辑:你不应该使用$ _SERVER ['PHP_SELF'],因为它不是很安全.只需将action属性设置为空,如下所示:action ="".空操作将导致表单POST到它发起的地址(与使用PHP_SELF相同,但没有安全性缺点).


rdl*_*rey 5

你有几个没有人提到过的问题.完整的,你的问题是:

  • 首先,你不应该使用$_SERVER['PHP_SELF']它,因为它不是很安全.
  • 其次,你使用反引号而不是单引号:$_SERVER[’PHP_SELF’]应该是$_SERVER['PHP_SELF']
  • 第三,你的HTML破了.

考虑一下您指定的代码:

class="action="<?php echo $_SERVER[’PHP_SELF’];?>" id="uploadform"
Run Code Online (Sandbox Code Playgroud)

这将您的表单的类属性指定为,action=并在该id属性之前留下一个随机的PHP片段,后跟一个孤立的双引号字符.

正确的<form>规范应该是:

<form method="post" action="" id="uploadform" enctype="multipart/form-data">
Run Code Online (Sandbox Code Playgroud)

UPDATE

根据要求,这里有一些进一步解释为什么$_SERVER['PHP_SELF']容易受到XSS攻击 ......

首先,了解$_SERVER['PHP_SELF']可以由用户操纵.你可能会问这是怎么回事.毕竟,对于位于的脚本/mypage.php,不应该$_SERVER['PHP_SELF']总是相等/mypage.php吗?

不必要.

Apache(以及我可能没有其他经验的其他服务器)利用带有URL的回顾功能,如果完整URL与特定资源不匹配,则允许它向后"向后"查看文件匹配的URL.例如,如果mypage.php是webroot中的实际可读文件而不是目录名,则以下地址将在mypage.php文件中找到匹配项:

http://domain.com/mypage.php/pretty-url << --- apache提供/mypage.php

在这一点上,你可能会想,"这很好,但是如何容易受到XSS的攻击?"

我很高兴你问.请考虑以下情形:

  1. 您在其action属性/mypage.php中使用$_SERVER['PHP_SELF']了一个表单.
  2. 恶意用户决定将以下内容放入其地址栏中:

http://domain.com/mypage.php/%22%3E%3Cscript%3Ealert('pwned')%3C/script%3E

突然,你指定的html为:

<form action="<?php echo $_SERVER['PHP_SELF']; ?>">
Run Code Online (Sandbox Code Playgroud)

现在呈现如下:

<form action="/mypage.php/"><script>alert('pwned')</script>
Run Code Online (Sandbox Code Playgroud)

这是一个相当无害的例子,因为它所做的只是弹出一个警告"pwned".然而,一个邪恶的人可以使用像这样的JavaScript代码来做更多更糟糕的事情.

您可以通过使用htmlentities您的$_SERVER['PHP_SELF']变量来避免这个特殊问题,但是,恕我直言,最好只是在这种情况下完全避免它.