2015-05-04 23 views
5

我是PHP新手,因此這可能是一個簡單的答案。我希望我的格式正確和正確的SO標準(仍然是新的網站。)

我正在處理兩套非常類似的代碼提交表單數據和使用htmlspecialchars停止XSS攻擊在我非常基本的開始PHP書通過SitePoint。很簡單,對。

當使用代碼設置1,我有一次我改變了形式的行動從

<form action="formpost.php" method="post"> 

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

我搜索SO,發現我需要檢查了未定義指數的錯誤如果$_REQUEST爲空或者不是爲了沒有未定義的索引並且擺脫那個錯誤。如果有人能夠向我解釋這一部分,我會非常感激。確實需要的東西是什麼周長回落下,以念Wo成爲Index?thiking,請不要取笑我了,我知道我可能聽起來很蠢 - >它是一個 Index因爲$_REQUEST是一個$_POST$_GET$_COOKIE是一個數組,數組內的數據是indexed,0,1,2,3,etc。?

我理解,因爲沒有$_REQUEST已取得$_REQUEST可能是可能是空的(我想是不是?),但是,是沒有劇本已經通過將數據輸入到表格激活,爲什麼會被預期的數據已經在$_REQUEST

代碼集1(thows錯誤[未定義指數]除非腳本檢查$_REQUEST爲空): 在這段代碼中,我只是讓最終用戶通過表單字段或通過張貼他們的名字一個字符串手動添加到URL並打印。

<?php 
if(!empty($_REQUEST)) 
{ 
    $firstname = $_REQUEST['firstname']; 
    $lastname = $_REQUEST['lastname']; 
    echo 'Welcome to our web site, ' . 
     htmlspecialchars($firstname, ENT_QUOTES, 'utf-8') . ' ' . 
     htmlspecialchars($lastname, ENT_QUOTES, 'utf-8') . '!'; 
} 
?> 
<!DOCTYPE html> 
<html lang="en"> 
    <head> 
     <meta charset="utf-8"> 
     <title>Query String Link Example</title> 
    </head> 

    <body> 
     <p> 
      <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post"> 
       <div><label for="firstname">First name: 
       <input type="text" name="firstname" id="firstname"></label> 
       </div> 
       <div><label for="lastname">Last name: 
       <input type="text" name="lastname" id="lastname"></label></div> 
       <div><input type="submit" value="GO"></div> 
      </form> 
     </p> 
    </body> 
</html> 

代碼集2(如果$_REQUEST被選中與否並不介意): 在這段代碼,我做同樣的事情,只是如果它正好是我的確切名稱,有它打印出一條特殊消息。

<?php 
    $firstname = $_REQUEST['firstname']; 
    $lastname = $_REQUEST['lastname']; 
     if ($firstname == 'Tommy' && $lastname='Loza') 
     { 
      echo 'Welcome to our web site web master!'; 
     } 
     else 
     { 
      echo 'Welcome to our web site, ' . 
       htmlspecialchars($firstname, ENT_QUOTES, 'utf-8') . ' ' . 
       htmlspecialchars($lastname, ENT_QUOTES, 'utf-8') . '!'; 
     } 
?> 
<!DOCTYPE html> 
<html lang="en"> 
    <head> 
     <meta charset="utf-8"> 
     <title>Conditional Query String Link Example</title> 
    </head> 

    <body> 
     <p> 
      <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post"> 
       <div><label for="firstname">First name: 
       <input type="text" name="firstname" id="firstname"></label> 
       </div> 
       <div><label for="lastname">Last name: 
       <input type="text" name="lastname" id="lastname"></label></div> 
       <div><input type="submit" value="GO"></div> 
      </form> 
     </p> 
    </body> 
</html> 

希望我沒有問太多愚蠢的問題和這個職位格式正確無誤。非常感謝SO社區。

湯米

+0

我覺得我在這裏#failed一點點。我的小Q在開始之後的主要問題是,爲什麼代碼集1需要檢查$ _REQUEST爲空而代碼集2沒有?一些如何添加條件語句改變了事情。 – tommydevs

+1

爲了防止XSS攻擊,應該是'<?php echo $ _SERVER ['PHP_SELF']; ?>'this'<?php echo htmlspecialchars($ _ SERVER ['PHP_SELF']); ?> – Pushkar

+0

我認爲你的問題爲什麼一切順利,但在第一個問題中,首先出現一些錯誤,然後當你在表單中放入某些東西並點擊按鈕時沒有錯。我對嗎? –

回答

4

基本上你不能訪問一個REQUEST索引,除非它存在。

如果你不使用if語句,它試圖訪問索引,不管它是否存在。因此,如果$ _REQUEST ['firstname']不存在,而是僅僅默認爲null,它將會給出未定義的索引錯誤,因爲$ _REQUEST是一個數組。

如果您嘗試使用未定義的變量,它會說「Undefined Variable」而不是「index」。

['firstname'] < - 這是索引。如果這不存在,則會出錯。

檢查它是否爲空也不一定是唯一的東西。我也可以檢查,看看是否名字和姓氏的設置,就像這樣:

if(!empty($_REQUEST) && isset($_REQUEST['firstname']) && isset($_REQUEST['lastname'])){ 
    //Code here 
} 

當然,你可以然後逐個檢查他們扔取決於缺少哪一個單獨的錯誤的能力。

- 編輯

此外,您還可以執行以下操作:

if($_SERVER['REQUEST_METHOD'] == "POST"){ 
    //code 
} 

因爲默認情況下,它被設置爲 「GET」。

+0

真棒的答案。沒有if語句,是否試圖自動定位索引,因爲代碼基本上是「運行」的,沒有任何檢查/餘額?在if語句正在檢查代碼的時候說:「首先,檢查這是否爲真,然後繼續」,並且因爲它沒有立即爲該索引尋找值?如果我掌握了這個權利,我會感覺很棒,因爲我完全理解你的答案。關於$ SERVER ['REQUEST_MEATHOD']的信息也非常棒。我發現了一篇很棒的SO文章,更詳細地解釋了這一點。良好的曝光。 – tommydevs

+1

我現在開始感到困惑,哈哈!至於爲什麼第二個人在工作,我不確定。如果使用第二種方法並刷新頁面而不輸入任何表單數據,則該表單不應該起作用,因爲表單尚未提交,因此獲取$ _REQUEST索引應該拋出一個錯誤。第一個刪除IF語句時停止工作的原因是因爲它在顯示錶單之前正在運行。所以如果表單沒有被提交,它需要檢查已經提交的值,然後才能使用它們。這有意義嗎? –

+1

基本上,因爲PHP是服務器端的,所以它在HTML之前運行。所以它試圖在顯示錶單之前使用表單中的數據。如果沒有數據,它會給你一個錯誤,然後顯然該表單不會顯示在頁面上。如果你在if語句中檢查數據是否被設置,那麼如果表單沒有被提交,那麼if語句將是false,因此不會運行大括號內的內容。看到這種現象的一種方式是,在if語句之後,添加一個else {}並將該表單粘貼到該表單中。然後表格只會顯示,如果尚未發送。 –

1

先給提交按鈕的名稱,並檢查是否點擊與否,如果你給同一個頁面的形式作用,從而沒有必要給行動讓它空白表下面的代碼

<?php 
if(isset($_POST['submit'])) 
{ 
    $firstname = $_REQUEST['firstname']; 
    $lastname = $_REQUEST['lastname']; 
    echo 'Welcome to our web site, ' . 
     htmlspecialchars($firstname, ENT_QUOTES, 'utf-8') . ' ' . 
     htmlspecialchars($lastname, ENT_QUOTES, 'utf-8') . '!'; 
} 
?> 
<!DOCTYPE html> 
<html lang="en"> 
    <head> 
     <meta charset="utf-8"> 
     <title>Query String Link Example</title> 
    </head> 

    <body> 
     <p> 
      <form action="" method="post"> 
       <div><label for="firstname">First name: 
       <input type="text" name="firstname" id="firstname"></label> 
       </div> 
       <div><label for="lastname">Last name: 
       <input type="text" name="lastname" id="lastname"></label></div> 
       <div><input type="submit" value="GO" name="submit"></div> 
      </form> 
     </p> 
    </body> 
</html> 
+0

謝謝你。很酷。因此,如果我有多個表單,我可以通過爲每個表單提供一個唯一的提交名稱並檢查isset($ _ POST ['submit-name'])來執行不同的操作。是對的嗎?再次感謝。 – tommydevs

+1

@tommydevs是的它是正確的多個表單提交按鈕的,但與按鈕的唯一名稱 –

1

按照你的問題。有很多情況下我們需要檢查空請求。 1.如果我們有多個提交按鈕的表單。在這種情況下,如果我們不驗證請求,則無法區分哪個表單已提交。

  1. 複選框和單選框只在您選擇時提交。因此有必要檢查是否選中了複選框/單選框。

3如果您使用表單,請始終使用post方法並使用$ _POST進行驗證,以防止XSS攻擊,因爲$ _REQUEST對$ _POST和$ _GET均有效。

  1. 您的第二套代碼可以工作,因爲文本字段在提交表單時總是發送值,而不管它們是否保留空白。

我希望這將有助於你

+0

關於1-3的優秀建議,謝謝!我不太理解第4個答案,因爲這兩組代碼都提供了相同的文本字段?只是澄清,錯誤是'onload'而不是'onsubmit'。再次感謝! – tommydevs

相關問題