PHP and HTML Form
PHP 中的 $_GET 和 $_POST 變數用於檢索表單中的資訊 當處理 HTML 表單時,PHP能把來自 HTML 頁面中的表單元素自動變成PHP指令碼元素。
PHP 表單和使用者輸入
form.html
<!--當用戶填寫完上面的表單並點選提交按鈕時,表單的資料會被送往名為 "welcome.php" 的 PHP 檔案-->
<form action="welcome.php" method="post">
名字: <input type="text" name="fname">
年齡: <input type="text" name="age" >
<input type="submit" value="提交">
</form>
welcome.php
歡迎<?php echo $_POST["fname"]; ?>!<br>
你的年齡是 <?php echo $_POST["age"]; ?> 歲。
PHP 獲取下拉選單的資料
- 下拉選單單選 表單使用 GET 方式獲取資料,action 屬性值為空表示提交到當前指令碼,通過 select 的 name 屬性獲取下拉選單的值:
<?php
$q = isset($_GET['q'])? htmlspecialchars ($_GET['q']) : '';
if($q) {
if($q =='RUNOOB') {
echo '菜鳥教程<br>http://www.runoob.com';
} else if($q =='GOOGLE') {
echo 'Google 搜尋<br>http://www.google.com';
} else if($q =='TAOBAO') {
echo '淘寶<br>http://www.taobao.com' ;
}
} else {
?>
<form action="" method="get">
<select name="q">
<option value="">選擇一個站點:</option>
<option value="RUNOOB">Runoob</option>
<option value="GOOGLE">Google</option>
<option value="TAOBAO">Taobao</option>
</select>
<input type="submit" value="提交">
</form>
<?php
}
?>
- 下拉選單多選 設定 select name=“q[]” 以陣列的方式獲取,使用 POST 方式提交:
<?php
$q = isset($_POST['q'])? $_POST['q'] : ''; // check whether q is empty
if(is_array($q)) {
$sites = array(
'RUNOOB' => '菜鳥教程: http://www.runoob.com',
'GOOGLE' => 'Google 搜尋: http://www.google.com',
'TAOBAO' => '淘寶: http://www.taobao.com',
);
foreach($q as $val) {
// PHP_EOL 為常量,用於換行
echo $sites[$val] . PHP_EOL;
}
} else {
?>
<form action="" method="post">
<select multiple="multiple" name="q[]">
<option value="">選擇一個站點:</option>
<option value="RUNOOB">Runoob</option>
<option value="GOOGLE">Google</option>
<option value="TAOBAO">Taobao</option>
</select>
<input type="submit" value="提交">
</form>
<?php
}
?>
- radio - 單選按鈕表單 PHP 單選按鈕表單中 name 屬性的值一致,value 值不同.
<?php
$q = isset($_GET['q'])? htmlspecialchars($_GET['q']) : '';
if($q) {
if($q =='RUNOOB') {
echo '菜鳥教程<br>http://www.runoob.com';
} else if($q =='GOOGLE') {
echo 'Google 搜尋<br>http://www.google.com';
} else if($q =='TAOBAO') {
echo '淘寶<br>http://www.taobao.com';
}
} else {
?><form action="" method="get">
<input type="radio" name="q" value="RUNOOB" />Runoob
<input type="radio" name="q" value="GOOGLE" />Google
<input type="radio" name="q" value="TAOBAO" />Taobao
<input type="submit" value="提交">
</form>
<?php
}
?>
- checkbox - 複選框 可以選多個值
<?php
$q = isset($_POST['q'])? $_POST['q'] : '';
if(is_array($q)) {
$sites = array(
'RUNOOB' => '菜鳥教程: http://www.runoob.com',
'GOOGLE' => 'Google 搜尋: http://www.google.com',
'TAOBAO' => '淘寶: http://www.taobao.com',
);
foreach($q as $val) {
// PHP_EOL 為常量,用於換行
echo $sites[$val] . PHP_EOL;
}
} else {
?><form action="" method="post">
<input type="checkbox" name="q[]" value="RUNOOB"> Runoob<br>
<input type="checkbox" name="q[]" value="GOOGLE"> Google<br>
<input type="checkbox" name="q[]" value="TAOBAO"> Taobao<br>
<input type="submit" value="提交">
</form>
<?php
}
?>
表單元素
HTML 表單提交資料程式碼如下
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
$_SERVER[“PHP_SELF”]是超級全域性變數,返回當前正在執行指令碼的檔名,與 document root相關; htmlspecialchars() 函式把一些預定義的字元轉換為 HTML 實體。
& (和號) 成為 & " (雙引號) 成為 " ’ (單引號) 成為 ' < (小於) 成為 < > (大於) 成為 >
XSS 攻擊(跨站指令碼攻擊)
惡意攻擊者往Web頁面裡插入惡意html程式碼,當用戶瀏覽該頁之時,嵌入其中Web裡面的html程式碼會被執行,從而達到惡意使用者的特殊目的。
如果我們直接這樣寫程式碼:
<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
<!--instantiation-->
<form method="post" action="test_form.php">
那麼,如果我們在url欄裡輸入如下地址:
則將被解析為可執行的惡意程式碼
<form method="post" action="test_form.php/"><script>alert('hacked')</script>
此時,利用htmlspecialchars() 函式則可以避免此類問題,我們修改程式碼如下:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
上述程式碼將會被解析為下述程式碼形式,避免了XSS漏洞。
<form method="post" action="test_form.php/"><script>alert('hacked')</script>">
使用 PHP 驗證表單資料
通過$_SERVER[“REQUEST_METHOD”]來檢測表單是否被提交 ; 當用戶提交表單時:
- 使用 PHP trim() 函式去除使用者輸入資料中不必要的字元 (如:空格,tab,換行);
- 使用PHP stripslashes()函式去除使用者輸入資料中的反斜槓 (); 對使用者所有提交的資料都通過htmlspecialchars() 函式處理。
總結為程式碼如下:
function test_input($data)
{
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
Form 必需欄位
利用empty($_POST[“xxx”])函式和if-else語句進行判斷
顯示錯誤資訊
can add following code:
<span class="error"><?php echo $Err;?></span>
驗證名稱
preg_match(string $pattern, string $subject) 在 subject 字串中搜索與 pattern 給出的正則表示式相匹配的內容。如果提供了 matches ,則其會被搜尋的結果所填充; $matches[0] 將包含與整個模式匹配的文字,$matches[1] 將包含與第一個捕獲的括號中的子模式所匹配的文字,以此類推。
int preg_match ( string $pattern , string $subject [, array $matches [, int $flags ]] )
驗證郵件 檢測 e-mail 地址是否合法
$email = test_input($_POST["email"]);
if (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email)) {
$emailErr = "非法郵箱格式";
}
驗證 URL 檢測URL地址是否合法
$website = test_input($_POST["website"]);
if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$website)) {
$websiteErr = "非法的 URL 的地址";
}
$_GET 和 $_POST 變數
$_GET | $_POST |
---|---|
收集來自 method=“get” 的表單中的值 | 收集來自 method=“post” 的表單中的值 |
表單域的名稱會自動成為 $_GET 陣列中的鍵 | 表單域的名稱會自動成為 $_POST 陣列中的鍵 |
變數名和值顯示在URL 中,對敏感資訊不安全 | 變數名和值不可見 |
可加入收藏夾 | 不可加入收藏夾 |
值不能超過2000字元 | 傳送資訊的量無限制,但一般預設為8MB,可通過php.ini 檔案中的 post_max_size 進行更改 |