php前端做過濾校驗
阿新 • • 發佈:2018-02-23
spec 實體 空格 如果 request 避免 input sla span 黑客可以利用這點重定向頁面到另外一臺服務器的頁面上,頁面 代碼文件中可以保護惡意代碼,代碼可以修改全局變量或者獲取用戶的表單數據。
// 定義變量並默認設置為空值
$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); \\將特殊字符轉碼,防XSS /*
*/ return $data;
}
?> 對表單輸入時做驗證(白名單方法)
http://www./test_form.php/%22%3E%3Cscript%3Ealert(‘hacked‘)%3C/script%3E
以上的 URL 中,將被解析為如下代碼並執行:
<form method="post" action="test_form.php/"><script>alert(‘hacked‘)</script>
代碼中添加了 script 標簽,並添加了alert命令。 當頁面載入時會執行該Javascript代碼(用戶會看到彈出框)。 這僅僅只是一個簡單的實例來說明PHP_SELF變量會被黑客利用。
請註意, 任何JavaScript代碼可以添加在<script>標簽中!
如何避免 $_SERVER["PHP_SELF"] 被利用?
$_SERVER["PHP_SELF"] 可以通過 htmlspecialchars() 函數來避免被利用。
form 代碼如下所示:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
htmlspecialchars() 把一些預定義的字符轉換為 HTML 實體。現在如果用戶想利用 PHP_SELF 變量, 結果將輸出如下所示:
<form method="post" action="test_form.php/"><script>alert(‘hacked‘)</script>">
嘗試該漏洞失敗!
使用 PHP 驗證表單數據
首先我們對用戶所有提交的數據都通過 PHP 的 htmlspecialchars() 函數處理。
當我們使用 htmlspecialchars() 函數時,在用戶嘗試提交以下文本域:
<script>location.href(‘http://www)</script>
該代碼將不會被執行,因為它會被保存為HTML轉義代碼,如下所示:
<script>location.href(‘http://www.‘)</script>
以上代碼是安全的,可以正常在頁面顯示或者插入郵件中。
當用戶提交表單時,我們將做以下兩件事情,:
- 使用 PHP trim() 函數去除用戶輸入數據中不必要的字符 (如:空格,tab,換行)。
- 使用PHP stripslashes()函數去除用戶輸入數據中的反斜杠 (\)
接下來讓我們將這些過濾的函數寫在一個我們自己定義的函數中,這樣可以大大提高代碼的復用性。
將函數命名為 test_input()。
現在,我們可以通過test_input()函數來檢測 $_POST 中的所有變量, 腳本代碼如下所示:
實例
<?php// 定義變量並默認設置為空值
$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); \\將特殊字符轉碼,防XSS /*
- & (和號) 成為 &
- " (雙引號) 成為 "
- ‘ (單引號) 成為 '
- < (小於) 成為 <
- > (大於) 成為 >
*/ return $data;
}
?> 對表單輸入時做驗證(白名單方法)
<?php
// 定義變量並默認設置為空值
$nameErr = $emailErr = $genderErr = $websiteErr = "";
$name = $email = $gender = $comment = $website = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
if (empty($_POST["name"])) {
$nameErr = "Name is required";
} else {
$name = test_input($_POST["name"]);
// 檢測名字是否只包含字母跟空格
if (!preg_match("/^[a-zA-Z ]*$/",$name)) {
$nameErr = "只允許字母和空格";
}
}
if (empty($_POST["email"])) {
$emailErr = "Email is required";
} else {
$email = test_input($_POST["email"]);
// 檢測郵箱是否合法
if (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email)) {
$emailErr = "非法郵箱格式";
}
}
if (empty($_POST["website"])) {
$website = "";
} else {
$website = test_input($_POST["website"]);
// 檢測 URL 地址是否合法
if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$website)) {
$websiteErr = "非法的 URL 的地址";
}
}
if (empty($_POST["comment"])) {
$comment = "";
} else {
$comment = test_input($_POST["comment"]);
}
if (empty($_POST["gender"