最新的Web開發教程
 

PHP 5表單驗證


這和下面的章節展示了如何使用PHP來驗證表單數據。


PHP表單驗證

處理PHP表單時認為安全性!

這些頁面將展示如何處理PHP形式考慮到安全性。 表單數據的適當的驗證是非常重要的保護您的形式從黑客和垃圾郵件發送者!

HTML表單,我們將在這些章節中的工作,包括各種輸入字段:必需和可選的文本字段,單選按鈕,和一個提交按鈕:

上述形式的驗證規則如下:

領域 驗證規則
名稱 需要。 +只能包含字母和空格
電子郵件 需要。 +必須包含一個有效的電子郵件地址(with @ and .)
網站 可選的。 如果存在,它必須包含一個有效的URL
評論 可選的。 多行輸入字段(textarea)
性別 需要。 必須選擇一個

首先,我們將著眼於為形式的純HTML的代碼:


文本字段

姓名,電子郵件和網站字段是文本輸入元素,註釋字段是一個textarea。 在HTML代碼如下所示:

Name: <input type="text" name="name">
E-mail: <input type="text" name="email">
Website: <input type="text" name="website">
Comment: <textarea name="comment" rows="5" cols="40"></textarea>

單選按鈕

性別字段是單選按鈕和HTML代碼如下所示:

Gender:
<input type="radio" name="gender" value="female">Female
<input type="radio" name="gender" value="male">Male

表單元素

表單的HTML代碼如下所示:

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

當表單提交,表單數據與方法=“POST”發送。

什麼是$ _SERVER [“PHP_SELF”]變量?

該$ _ SERVER [“PHP_SELF”]是一個超級全局變量返回當前執行腳本的文件名。

所以,$ _ SERVER [“PHP_SELF”]提交的表單數據發送到頁面本身,而不是跳轉到不同的頁面。 通過這種方式,用戶將得到相同的頁面表單上的錯誤消息。

什麼是htmlspecialchars()函數?

htmlspecialchars()函數的特殊字符轉換為HTML實體。 這意味著它將替換的HTML字符像<和>以&lt; 和取代。 這可以防止攻擊者通過注入HTML或JavaScript代碼利用的代碼(Cross-site Scripting attacks)的形式。


在PHP形式的擔保大注意事項

該$ _ SERVER [“PHP_SELF”]變量可以被黑客使用!

如果PHP_SELF在您的網頁使用,那麼用戶可以輸入一個斜杠(/)然後一些跨站點腳本(XSS)命令來執行。

跨站點腳本(XSS)是一種類型的計算機安全漏洞,通常在Web應用程序中。 XSS允許攻擊者注入客戶端腳本到其他用戶瀏覽過的網頁。

假設我們有一個名為頁面下面的表格"test_form.php"

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

現在,如果用戶輸入在像地址欄中的正常URL "http://www.example.com/test_form.php"上面的代碼將被轉換為:

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

到現在為止還挺好。

然而,考慮到用戶輸入在地址欄中輸入以下網址:

http://www.example.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E

在這種情況下,上面的代碼將被轉換為:

<form method="post" action="test_form.php/"><script>alert('hacked')</script>

該代碼添加一個腳本標記和警報命令。 而在頁面加載時,JavaScript代碼會被執行(the user will see an alert box) 。 這只是一個簡單的和無害例如PHP_SELF變量如何被利用的。

要注意的是任何JavaScript代碼可以在裡面添加<script>標記! 黑客可以將用戶重定向到另一台服務器上的文件,而該文件可以保存惡意代碼,可以改變全局變量或提交表單到另一個地址保存用戶數據,例如。


如何避免$ _ SERVER [“PHP_SELF”]漏洞?

$ _SERVER [“PHP_SELF”]漏洞可以通過使用避免htmlspecialchars()函數。

表單代碼應該是這樣的:

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

htmlspecialchars()函數的特殊字符轉換為HTML實體。 現在,如果用戶試圖利用這個PHP_SELF變量,它會導致下面的輸出:

<form method="post" action="test_form.php/&quot;&gt;&lt;script&gt;alert('hacked')&lt;/script&gt;">

該漏洞的嘗試失敗,並沒有造成任何傷害!


驗證表單數據用PHP

我們會做的第一件事是通過PHP的所有變量htmlspecialchars()函數。

當我們使用htmlspecialchars()函數; 那麼,如果用戶試圖提交的文本字段中輸入以下:

<SCRIPT>位置。 href('http://www.hacked.com') </ SCRIPT>

- 這將不會被執行,因為它會被保存為HTML代碼逃脫,就像這樣:

&LT;腳本&GT;位置。 href('http://www.hacked.com') &LT; /腳本&GT;

該代碼現在是安全的網頁上或內部電子郵件顯示。

我們也將做兩件事,當用戶提交表單:

  1. 條不必要的字符(extra space, tab, newline)從用戶輸入的數據(with the PHP trim()函數)
  2. 除去反斜杠(\)從用戶輸入的數據(with the PHP stripslashes()功能)

下一步是創建一個函數,將盡一切為我們檢查(which is much more convenient than writing the same code over and over again)

我們將其命名為功能test_input()

現在,我們可以檢查每個$ _ POST變量與test_input()函數,和腳本如下所示:

<?php
// define variables and set to empty values
$name = $email = $gender = $comment = $website = "";

if ($_SERVER["REQUEST_METHOD"] == "POST") {
  $name = test_input($_POST["name"]);
  $email = test_input($_POST["email"]);
  $website = test_input($_POST["website"]);
  $comment = test_input($_POST["comment"]);
  $gender = test_input($_POST["gender"]);
}

function test_input($data) {
  $data = trim($data);
  $data = stripslashes($data);
  $data = htmlspecialchars($data);
  return $data;
}
?>
運行示例»

請注意,在腳本的開始,我們檢查是否有形式使用$ _ SERVER [“REQUEST_METHOD”]被提交。 如果REQUEST_METHOD是POST,則表單已經提交 - 它應該進行驗證。 如果它沒有被提交,跳過驗證,並顯示一個空白表格。

然而,在上述的例子中,所有的輸入字段是可選的。 即使用戶不輸入任何數據的腳本工作正常。

下一步是使所需的輸入字段,如果需要創建錯誤消息。