2012-02-13 35 views
0

我有一個聯繫表單,它在我的服務器上託管時工作正常,但是當我將其上傳到我的客戶機服務器時,我遇到了問題。請查看這裏的頁面:http://www.conceptonegfx.com/contact.phpPHP表單 - 未定義常量'PHP_SELF'

我會在形式

通知的頂部以下錯誤:使用未定義的常量「PHP_SELF」的 - 在電子商務假定'PHP_SELF「」:\域\ C \ conceptonegfx.com \ user \ htdocs \ fns.php on line 42

注意:未定義的索引:E:\ Domains \ c \ conceptonegfx.com \ user \ htdocs \ fns.php中的'PHP_SELF'在第42行「 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> 

回答

6

不知道這是否是問題或複製粘貼的事情,但:

’PHP_SELF’ 

確實應該

'PHP_SELF' 

看一看在manual

編輯從rdlowrey的帖子: 您不應使用$ _SERVER ['PHP_SELF'],因爲它不太安全。只需將action屬性留空即可:action =「」。一個空的動作會導致表單POST到它發起的地址(與使用PHP_SELF相同,但沒有安全缺點)。

+0

@rdlowrey在那裏添加你的東西,並給你信用。 – Iznogood 2012-02-13 19:15:00

+0

信用沒有必要,只是正確。 Downvote取消,upvote給出。每個人都會錯過一些東西(我確定)。重要的是編輯你的答案,如果有人發現你遺漏或錯誤的東西。 – rdlowrey 2012-02-13 19:19:18

-2

你似乎有複製粘貼的代碼。

修復''。注意到你HVE使用代替'

變化$_SERVER[’PHP_SELF’]$_SERVER['PHP_SELF']

+0

-1'$ _SERVER ['PHP_SELF']'容易受到XSS攻擊。這應該被提及。 – rdlowrey 2012-02-13 15:10:37

5

你有幾個,沒有人提到的問題。在充分,你的問題是:

  • 首先,你不應該使用$_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"> 

UPDATE

按照要求,這裏就是爲什麼$_SERVER['PHP_SELF']易受XSS attacks一些進一步的解釋...

第一,明白$_SERVER['PHP_SELF']可以是ma由用戶操控。你可能會問這怎麼可能。畢竟,對於位於/mypage.php的腳本,不應該是$_SERVER['PHP_SELF']總是等於/mypage.php

不一定。

Apache(也許是我沒有經驗的其他服務器)利用帶URL的回溯功能,如果完整的URL與特定資源不匹配,則允許其在URL的「向後」下查找文件匹配。例如,下面的地址會發現mypage.php文件匹配,如果mypage.php是在Webroot公司的實際讀取的文件,而不是目錄的名稱:

http://domain.com/mypage.php/pretty-url < < ---阿帕奇擔任了/ mypage.php

在這一點上,你可能會想:「這很好,但是如何容易受到XSS?」

我很高興你問。考慮以下情形:

  1. 您有一個在/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']; ?>"> 

現在呈現這樣的:

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

這是一個相當無害的例子,因爲它所做的只是彈出一個警報,提示「pwned」。然而,一個邪惡的人可以使用這樣的JavaScript代碼來做很多難看的事情。

你可以通過你的$_SERVER['PHP_SELF']使用可變htmlentities,但是避免這個特殊的問題,恕我直言最好只是爲了完全避免它在這種情況下。

+0

你能解釋一下PHP_SELF的問題嗎? – vascowhite 2012-02-18 22:59:20

+0

@vascowhite根據您的評論請求添加了解釋 – rdlowrey 2012-02-19 01:21:01