首頁  >  文章  >  後端開發  >  php中關於過濾和驗證以及轉義與密碼的實作教程

php中關於過濾和驗證以及轉義與密碼的實作教程

黄舟
黄舟原創
2017-07-24 14:40:431369瀏覽

我們在開發應用程式時,一般有個約定:不要信任任何來自不受自己控制的資料來源中的資料。所以這個時候就用到了這篇文章介紹的內容,本文主要給大家介紹了關於PHP實踐教程之過濾、驗證、轉義與密碼的相關資料,需要的朋友可以參考借鑒,下面來一起看看吧。

本文主要跟大家介紹的是關於PHP實踐之過濾、驗證、轉義與密碼等相關的內容,分享出來供大家參考學習,下面話不多說了,來一起看看詳細的介紹:

一、過濾、驗證和轉義

#1).不要相信任何來自不受自己直接控制的資料來源中的數據。包含但不限於:

  • $_GET

  • #$_POST

  • ##$_REQUEST

  • #$_COOKIE

  • $argv

  • php://stdin

  • php://input

  • file_get_contents()

  • #遠端資料庫

  • 遠端API

  • 來自客戶端的資料

#2)。解決方法:過濾輸入。刪除不安全的字符,在資料到達應用的儲存層之前,必須過濾資料。需要過濾的資料包括不限於:HTML、SQL查詢和使用者資料資訊。

  • HTML:使用

    htmlentities()函數過濾HTML成對應的實體。這個函數會轉義制定字符的HTML字符,以便在儲存層安全的渲染。正確的使用方式是使用htmlentities($input, ENT_QUOTES, 'UTF-8')過濾輸入。或使用HTML Purifier。缺點是慢

  • SQL查詢: 有時必須根據資料建構SQL查詢。這時要使用PDO預處理語句過濾外部資料。

  • 使用者資料資訊:使用

    filter_var()filter_input()過濾使用者資料資訊

3).驗證資料:也可以使用

filter_var() ,驗證成功傳回要驗證的值,失敗回傳false。但是這個函數無法驗證所有數據,所以可以使用一些驗證功能元件。例如aura/filter或symfony/validator

4)轉義輸出:任然可以使用htmlentities這個函數,有些模板引擎也自帶了轉義功能。

密碼

       1).絕對無法知道使用者的密碼。


       2).絕對不要約束使用者的密碼,要限制的話語只限制最小長度。


       3).絕對無法使用電子郵件傳送使用者的密碼。你可以發送一個修改密碼的鏈接,上面帶一個token驗證是用戶本人就行了。


       4).使用bcrypt計算使用者密碼的雜湊值。加密和哈希不是一回事,加密是雙向演算法,加密的資料可以被解密。但是哈希是單項演算法,哈希之後的資料無法被還原,想同的資料哈希之後得到的資料總是相同的。使用資料庫儲存通過bcrypt雜湊密碼之後的值。


       5).使用密碼雜湊API簡化計算密碼雜湊和驗證密碼的操作。以下的註冊用戶的一般操作


POST /register.php HTTP/1.1
Content-Length: 43
Content-type: application/x-www-form-urlencoded

email=xiao@hello.world&password=nihao

下面是接受這個請求的PHP檔案


<?php
try {
 $email = filter_input(INPUT_POST, &#39;email&#39;, FILTER_VALIDATE_EMAIL);
 if (!$email) {
  throw new Exception(&#39;Invalid email&#39;);
 }
 $password = filter_iput(INPUT_POST, &#39;password&#39;);
 if (!$password || mb_strlen($password) < 8) {
  throw new Exception(&#39;Password must contain 8+ characters&#39;);
 }
 //创建密码的哈希值
 $passwordHash = password_hash(
  $password,
  PASSWORD_DEFAULT,
  [&#39;cost&#39; => 12]
  );

 if ($passwordHash === false) {
  throw new Exception(&#39;Password hash failed&#39;);
 }

 //创建用户账户,这里是虚构的代码
 $user = new User();
 $user->email = $email;
 $user->password_hash = $passwordHash;
 $user->save();
 header(&#39;HTTP/1.1 302 Redirect&#39;);
 header(&#39;Location: /login.php&#39;);
} catch (Exception $e) {
 header(&#39;HTTP1.1 400 Bad Request&#39;);
 echo $e->getMessage();
}

       6).根據機器的具體運算能力修改

password_hash()的第三個值。計算哈希值一般需要0.1s-0.5s。

       7).密碼的雜湊值儲存在

varchar(255)類型的資料庫欄位中。

       8).登入使用者的一般流程


POST /login.php HTTP1.1
Content-length: 43
Content-Type: application/x-www-form-urlencoded

email=xiao@hello.wordl&pasword=nihao


session_start();
try {
 $email = filter_input(INPUT_POST, &#39;email&#39;);
 $password = filter_iinput(INPUT_POST, &#39;password&#39;);

 $user = User::findByEmail($email);

 if (password_verify($password, $user->password_hash) === false) {
  throw new Exception(&#39;&#39;Invalid password);
 }

 //如果需要的话,重新计算密码的哈希值
 $currentHasAlgorithm = PASSWORD_DEFAULT;
 $currentHashOptions = array(&#39;cost&#39; => 15);
 $passwordNeedsRehash = password_needs_rehash(
  $user->password_hash,
  $currentHasAlgorithm,
  $currentHasOptions
 );
 if ($passwordNeedsRehash === true) {
  $user->password_hash = password_hash(
   $password,
   $currentHasAlgorithm,
   $currentHasOptions
  );

  $user->save();
 }

 $_SESSION[&#39;user_logged_in&#39;] = &#39;yes&#39;;
 $_SESSION[&#39;user_email&#39;] = $email;

 header(&#39;HTTP/1.1 302 Redirect&#39;);
 header(&#39;Location: /user-profile.php&#39;);
} catch (Exception) {
 header(&#39;HTTP/1.1 401 Unauthorized&#39;);
 echo $e->getMessage();
}

      9).PHP5.5.0版本版本之前的密碼雜湊API無法使用,建議使用ircmaxell/password-compat組件。

總結#

以上是php中關於過濾和驗證以及轉義與密碼的實作教程的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn