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

时间:2012-02-13 14:50:16

标签: php html forms submit self

我有一个联系表单,它在我的服务器上托管时工作正常,但是当我将它上传到我的客户端服务器时,我遇到了问题。请查看此处的页面: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> 

3 个答案:

答案 0 :(得分:6)

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

’PHP_SELF’

应该是

'PHP_SELF'

查看manual

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

答案 1 :(得分:5)

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

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

考虑您指定的代码:

class="action="<?php echo $_SERVER[’PHP_SELF’];?>" id="uploadform"

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

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

<form method="post" action="" id="uploadform" enctype="multipart/form-data">

<强>更新

根据要求,以下是$_SERVER['PHP_SELF']易受XSS attacks攻击的原因的进一步说明......

首先,要了解用户可以操纵$_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&lt;&lt; --- apache提供/mypage.php

此时你可能会想,“那很好但是这对XSS有什么影响?”

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

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

    http://domain.com/mypage.php/%22%3E%3Cscript%3Ealert( 'PWNED')%3C /脚本%3E

    突然,您指定的html为:

    <form action="<?php echo $_SERVER['PHP_SELF']; ?>">
    

    现在渲染如下:

    <form action="/mypage.php/"><script>alert('pwned')</script>
    

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

    您可以在htmlentities变量上使用$_SERVER['PHP_SELF']来避免此特定问题,但恕我直言最好只是在这种情况下完全避免它。

答案 2 :(得分:-2)

您似乎已复制粘贴代码。

修复''。请注意,您已使用而不是'

$_SERVER[’PHP_SELF’]更改为$_SERVER['PHP_SELF']