1. 程式人生 > >php前端做過濾校驗

php前端做過濾校驗

spec 實體 空格 如果 request 避免 input sla span

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/&quot;&gt;&lt;script&gt;alert(‘hacked‘)&lt;/script&gt;">

嘗試該漏洞失敗!


使用 PHP 驗證表單數據

首先我們對用戶所有提交的數據都通過 PHP 的 htmlspecialchars() 函數處理。

當我們使用 htmlspecialchars() 函數時,在用戶嘗試提交以下文本域:

<script>location.href(‘http://www)</script>

該代碼將不會被執行,因為它會被保存為HTML轉義代碼,如下所示:

&lt;script&gt;location.href(‘http://www.‘)&lt;/script&gt;

以上代碼是安全的,可以正常在頁面顯示或者插入郵件中。

當用戶提交表單時,我們將做以下兩件事情,:

  1. 使用 PHP trim() 函數去除用戶輸入數據中不必要的字符 (如:空格,tab,換行)。
  2. 使用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 /*
  • & (和號) 成為 &amp;
  • " (雙引號) 成為 &quot;
  • ‘ (單引號) 成為 &#039;
  • < (小於) 成為 &lt;
  • > (大於) 成為 &gt;

*/ 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"])) {
      $genderErr = "性別是必需的";
   } else {
      $gender = test_input($_POST["gender"]);
   }
}
?>

php前端做過濾校驗