目錄
。過濾輸入" >。過濾輸入
首頁 後端開發 php教程 PHP安全-過濾輸入

PHP安全-過濾輸入

Feb 22, 2017 am 09:33 AM



。過濾輸入

#       過濾是Web應用安全的基礎。它是你驗證資料合法性的過程。透過在輸入時確認對所有的資料進行過濾,你可以避免被污染(未過濾)資料在你的程式中被誤信及誤用。大多數流行的PHP應用的漏洞最終都是因為沒有對輸入進行適當過濾造成的。

 

       我所指的濾波輸入是指三個不同的步驟:

#l        識別輸入

l        過濾輸入

#l        過濾輸入

 

       把辨識輸入做為第一步是因為如果你不知道它是什麼,你也就無法正確地過濾它。輸入是指所有源自外部的資料。例如,所有發自客戶端的是輸入,但客戶端並不是唯一的外部資料來源,其它如資料庫和RSS推送等也是外部資料來源。

       使用者輸入的資料非常容易識別,PHP以兩個超級公用陣列$_GET 和$_POST來存放用戶輸入資料。其它的輸入要難以辨識得多,例如,$_SERVER陣列中的許多元素是由客戶端所操縱的。常常很難確認$_SERVER數組中的哪些元素組成了輸入,所以,最好的方法就是把整個數組看成輸入。

       在某些情況下,你把什麼當作輸入取決於你的觀點。例如,session資料被保存在伺服器上,你可能不會認為session資料是一個外部資料來源。如果你持這種觀點的話,可以把session資料的保存位置是在你的軟體的內部。意識到session的保存位置的安全與軟體的安全是聯繫在一起的事實是非常明智的。同樣的觀點可以推及到資料庫,你也可以把它看成你軟體的一部分。

       一般來說,把session保存位置與資料庫看成是輸入是比較安全的,同時這也是我在所有重要的PHP應用開發中所推薦的方法。

       一旦辨識了輸入,你就可以過濾它了。過濾是一個有點正式的術語,它在平時表述中有很多同義詞,例如驗證、清潔和淨化。儘管這些大家平時所用的術語稍有不同,但它們都是指的同一個處理:防止非法資料進入你的應用。

       有很多種方法過濾數據,其中有一些安全性較高。最好的方法是把過濾看成是一個檢查的過程。請不要試圖好心地去修正非法數據,要讓你的用戶照你的規則去做,歷史證明了試圖修正非法數據往往會導致安全漏洞。例如,考慮一下下面的試圖防止目錄跨越的方法(存取上層目錄)。

 

CODE:

 

<?php
 
  $filename = str_replace(&#39;..&#39;, &#39;.&#39;,
$_POST[&#39;filename&#39;]);
 
  ?>
登入後複製


##

       你能想到$_POST['filename']如何取值以讓$filename成為Linux系統中使用者口令檔案的路徑../../etc/passwd嗎?

 

       答案很簡單:

  .../.../etc/passwd
登入後複製

 

#       這個特定的錯誤可以透過重複替換直到找不到為止:

 

##CODE:#### ######## ######
  <?php
  $filename = $_POST[&#39;filename&#39;];
  while (strpos($_POST[&#39;filename&#39;], &#39;..&#39;) !=  =
FALSE)
  {
    $filename = str_replace(&#39;..&#39;, &#39;.&#39;,
$filename);
  }
  ?>
登入後複製
##################### ###########       當然,函數basename( )可以取代上面的所有邏輯,同時也能更安全地達到目的。不過重要點在於任何試圖糾正非法數據的舉動都可能導致潛在錯誤並允許非法數據通過。只做檢查是一個更安全的選擇。 ############ ######

译注:这一点深有体会,在实际项目曾经遇到过这样一件事,是对一个用户注册和登录系统进行更改,客户希望用户名前后有空格就不能登录,结果修改时对用户登录程序进行了更改,用trim()函数把输入的用户名前后的空格去掉了(典型的好心办坏事),但是在注册时居然还是允许前后有空格!结果可想而知。

除了把过滤做为一个检查过程之外,你还可以在可能时用白名单方法。它是指你需要假定你正在检查的数据是非法的,除非你能证明它是合法的。换而言之,你宁可在小心上犯错。使用这个方法,一个错误只会导致你把合法的数据当成是非法的。尽管不想犯任何错误,但这样总比把非法数据当成合法数据要安全得多。通过减轻犯错引起的损失,你可以提高你的应用的安全性。尽管这个想法在理论上是很自然的,但历史证明,这是一个很有价值的方法。

如果你能正确可靠地识别和过滤输入,你的工作就基本完成了。最后一步是使用一个命名约定或其它可以帮助你正确和可靠地区分已过滤和被污染数据的方法。我推荐一个比较简单的命名约定,因为它可以同时用在面向过程和面向对象的编程中。我用的命名约定是把所有经过滤的数据放入一个叫$clean的数据中。你需要用两个重要的步骤来防止被污染数据的注入:

l 经常初始化$clean为一个空数组。

l 加入检查及阻止来自外部数据源的变量命名为clean,

实际上,只有初始化是至关紧要的,但是养成这样一个习惯也是很好的:把所有命名为clean的变量认为是你的已过滤数据数组。这一步骤合理地保证了$clean中只包括你有意保存进去的数据,你所要负责的只是不在$clean存在被污染数据。

为了巩固这些概念,考虑下面的表单,它允许用户选择三种颜色中的一种;

CODE:

 <form action="process.php" method="POST">
  Please select a color:
  <select name="color">
    <option value="red">red</option>
    <option
value="green">green</option>
    <option
value="blue">blue</option>
  </select>
  <input type="submit" />
  </form>
登入後複製


##

在处理这个表单的编程逻辑中,非常容易犯的错误是认为只能提交三个选择中的一个。在第二章中你将学到,客户端能提交任何数据作为$_POST['color']的值。为了正确地过滤数据,你需要用一个switch语句来进行:

CODE:

  <?php
 
  $clean = array(  );
  switch($_POST[&#39;color&#39;])
  {
    case &#39;red&#39;:
    case &#39;green&#39;:
    case &#39;blue&#39;:
      $clean[&#39;color&#39;] = $_POST[&#39;color&#39;];
      break;
  }
 
  ?>
登入後複製


##

本例中首先初始化了$clean为空数组以防止包含被污染的数据。一旦证明$_POST['color']是red, green, 或blue中的一个时,就会保存到$clean['color']变量中。因此,可以确信$clean['color']变量是合法的,从而在代码的其它部分使用它。当然,你还可以在switch结构中加入一个default分支以处理非法数据的情况。一种可能是再次显示表单并提示错误。特别小心不要试图为了友好而输出被污染的数据。

上面的方法对于过滤有一组已知的合法值的数据很有效,但是对于过滤有一组已知合法字符组成的数据时就没有什么帮助。例如,你可能需要一个用户名只能由字母及数字组成:

CODE:

 <?php
 
  $clean = array(  );
 
  if (ctype_alnum($_POST[&#39;username&#39;]))
  {
    $clean[&#39;username&#39;] = $_POST[&#39;username&#39;];
  }
 
  ?>
登入後複製


##

       尽管在这种情况下可以用正则表达式,但使用PHP内置函数是更完美的。这些函数包含错误的可能性要比你自已写的代码出错的可能性要低得多,而且在过滤逻辑中的一个错误几乎就意味着一个安全漏洞。

 

以上就是PHP安全-过滤输入的内容,更多相关内容请关注PHP中文网(www.php.cn)!


##

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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 Dec 24, 2024 pm 04:42 PM

PHP 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 Dec 20, 2024 am 11:31 AM

Visual Studio Code,也稱為 VS Code,是一個免費的原始碼編輯器 - 或整合開發環境 (IDE) - 可用於所有主要作業系統。 VS Code 擁有大量針對多種程式語言的擴展,可以輕鬆編寫

在PHP API中說明JSON Web令牌(JWT)及其用例。 在PHP API中說明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

php程序在字符串中計數元音 php程序在字符串中計數元音 Feb 07, 2025 pm 12:12 PM

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

您如何在PHP中解析和處理HTML/XML? 您如何在PHP中解析和處理HTML/XML? Feb 07, 2025 am 11:57 AM

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

解釋PHP中的晚期靜態綁定(靜態::)。 解釋PHP中的晚期靜態綁定(靜態::)。 Apr 03, 2025 am 12:04 AM

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? 什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? Apr 03, 2025 am 12:03 AM

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。

PHP和Python:比較兩種流行的編程語言 PHP和Python:比較兩種流行的編程語言 Apr 14, 2025 am 12:13 AM

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

See all articles