程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP綜合 >> PHP網站常見幾種攻擊詳解

PHP網站常見幾種攻擊詳解

編輯:PHP綜合

PHP網站常見幾種攻擊詳解

PHP網站建設中常見的安全威脅包括:SQL 注入、操縱 GET 和 POST 變量、緩沖區溢出攻擊、跨站點腳本攻擊、浏覽器內的數據操縱和遠程表單提交。

1、防止SQL注入攻擊

在 SQL 注入攻擊 中,用戶通過操縱表單或 GET 查詢字符串,將信息添加到數據庫查詢中。

例如,假設有一個簡單的登錄數據庫。這個數據庫中的每個記錄都有一個用戶名字段和一個密碼字段。構建一個登錄表單,讓用戶能夠登錄。

解決這個問題的辦法是,將 PHP 的內置 mysql_real_escape_string() 函數用作任何用戶輸入的包裝器。

這個函數對字符串中的字符進行轉義,使字符串不可能傳遞撇號等特殊字符並讓 MySQL 根據特殊字符進行操作。清單 7 展示了帶轉義處理的代碼。

2、防止用戶操縱變量

在前一節中,防止了用戶使用畸形的密碼進行登錄。如果您很聰明,應該應用您學到的方法,確保對 SQL 語句的所有用戶輸入進行轉義。

但是,用戶現在已經安全地登錄了。用戶擁有有效的密碼,並不意味著他將按照規則行事 —— 他有很多機會能夠造成損害。例如,應用程序可能允許用戶查看特殊的內容。

比如 template.php?pid=33 或 template.php?pid=321。URL 中問號後面的部分稱為查詢字符串。因為查詢字符串直接放在 URL 中,所以也稱為 GET 查詢字符串。

這裡有什麼錯嗎?

首先,這裡隱含地相信來自浏覽器的 GET 變量 pid 是安全的。

這會怎麼樣呢?

大多數用戶沒那麼聰明,無法構造出語義攻擊。但是,如果他們注意到浏覽器的 URL 位置域中的 pid=33,就可能開始搗亂。

如果他們輸入另一個數字,那麼可能沒問題;但是如果輸入別的東西,比如輸入 SQL 命令或某個文件的名稱(比如 /etc/passwd),或者搞別的惡作劇,比如輸入長達 3,000 個字符的數值,那麼會發生什麼呢?

在這種情況下,要記住基本規則,不要信任用戶輸入。

應用程序開發人員知道 template.php 接受的個人標識符(PID)應該是數字,所以可以使用 PHP 的 is_numeric() 函數確保不接受非數字的 PID。

需要做的只是使用 strlen() 檢查變量的長度是否非零;如果是,就使用一個全數字正則表達式來確保數據元素是有效的。如果 PID 包含字母、斜線、點號或任何與十六進制相似的內容,那麼這個例程捕獲它並將頁面從用戶活動中屏蔽。

3、緩沖區溢出攻擊

緩沖區溢出攻擊 試圖使 PHP 應用程序中(或者更精確地說,在 Apache 或底層操作系統中)的內存分配緩沖區發生溢出。

請記住,您可能是使用 PHP 這樣的高級語言來編寫 Web 應用程序,但是最終還是要調用 C(在 Apache 的情況下)。與大多數低級語言一樣,C 對於內存分配有嚴格的規則。

緩沖區溢出攻擊向緩沖區發送大量數據,使部分數據溢出到相鄰的內存緩沖區,從而破壞緩沖區或者重寫邏輯。這樣就能夠造成拒絕服務、破壞數據或者在遠程服務器上執行惡意代碼。
防止緩沖區溢出攻擊的惟一方法是檢查所有用戶輸入的長度。

注意,緩沖區溢出攻擊並不限於長的數字串或字母串。也可能會看到長的十六進制字符串(往往看起來像 \xA3 或 \xFF)。

記住,任何緩沖區溢出攻擊的目的都是淹沒特定的緩沖區,並將惡意代碼或指令放到下一個緩沖區中,從而破壞數據或執行惡意代碼。

對付十六進制緩沖區溢出最簡單的方法也是不允許輸入超過特定的長度。
如果您處理的是允許在數據庫中輸入較長條目的表單文本區,那麼無法在客戶端輕松地限制數據的長度。在數據到達 PHP 之後,可以使用正則表達式清除任何像十六進制的字符串。

4、跨站點腳本攻擊

在跨站點腳本(XSS)攻擊中,往往有一個惡意用戶在表單中(或通過其他用戶輸入方式)輸入信息,這些輸入將惡意的客戶端標記插入過程或數據庫中。

例如,假設站點上有一個簡單的來客登記簿程序,讓訪問者能夠留下姓名、電子郵件地址和簡短的消息。

惡意用戶可以利用這個機會插入簡短消息之外的東西,比如對於其他用戶不合適的圖片或將用戶重定向到另一個站點的 JavaScript,或者竊取 cookie 信息。

幸運的是,PHP 提供了 strip_tags() 函數,這個函數可以清除任何包圍在 HTML 標記中的內容。strip_tags() 函數還允許提供允許標記的列表。

從 安全的角度來看,對公共用戶輸入使用 strip_tags() 是必要的。如果表單在受保護區域(比如內容管理系統)中,而且您相信用戶會正確地執行他們的任務(比如為 Web 站點創建 HTML 內容),那麼使用 strip_tags() 可能是不必要的,會影響工作效率。

還有一個問題:如果要接受用戶輸入,比如對貼子的評論或來客登記項,並需要將這個輸入向其他用戶顯示,那麼一定要將響應放在 PHP 的 htmlspecialchars() 函數中。

這個函數將與符號、< 和 > 符號轉換為 HTML 實體。例如,與符號(&)變成 &。這樣的話,即使惡意內容躲開了前端 strip_tags() 的處理,也會在後端被 htmlspecialchars() 處理掉。

5、浏覽器內的數據操縱

有一類浏覽器插件允許用戶篡改頁面上的頭部元素和表單元素。使用 Tamper Data(一個 Mozilla 插件),可以很容易地操縱包含許多隱藏文本字段的簡單表單,從而向 PHP 和 MySQL 發送指令。

用戶在點擊表單上的 Submit 之前,他可以啟動 Tamper Data。在提交表單時,他會看到表單數據字段的列表。

Tamper Data 允許用戶篡改這些數據,然後浏覽器完成表單提交。

要防御這種工具,最簡單的方法是假設任何用戶都可能使用 Tamper Data(或類似的工具)。

只提供系統處理表單所需的最少量的信息,並把表單提交給一些專用的邏輯。例如,注冊表單應該只提交給注冊邏輯。

如果已經建立了一個通用表單處理函數,有許多頁面都使用這個通用邏輯,那該怎麼辦?

如果使用隱藏變量來控制流向,那該怎麼辦?

例如,可能在隱藏表單變量中指定寫哪個數據庫表或使用哪個文件存儲庫。有 4 種選擇:

不改變任何東西,暗自祈禱系統上沒有任何惡意用戶。

重寫功能,使用更安全的專用表單處理函數,避免使用隱藏表單變量。

使用 md5() 或其他加密機制對隱藏表單變量中的表名或其他敏感信息進行加密。在 PHP 端不要忘記對它們進行解密。

通過使用縮寫或昵稱讓值的含義模糊,在 PHP 表單處理函數中再對這些值進行轉換。例如,如果要引用 users 表,可以用 u 或任意字符串(比如 u8y90×0jkL)來引用它。

後兩個選項並不完美,但是與讓用戶輕松地猜出中間件邏輯或數據模型相比,它們要好得多了。

6、遠程表單提交

Web 的好處是可以分享信息和服務。壞處也是可以分享信息和服務,因為有些人做事毫無顧忌。

以 表單為例。任何人都能夠訪問一個 Web 站點,並使用浏覽器上的 File > Save As 建立表單的本地副本。然後,他可以修改 action 參數來指向一個完全限定的 URL(不指向 formHandler.php,而是指向http://www.yoursite.com/formHandler.php,因為表單在這個站點上), 做他希望的任何修改,點擊 Submit,服務器會把這個表單數據作為合法通信流接收。

首先可能考慮檢查 $_SERVER['HTTP_REFERER'],從而判斷請求是否來自自己的服務器,這種方法可以擋住大多數惡意用戶,但是擋不住最高明的黑客。這些人足夠聰明,能夠篡改頭部中的引用者信息,使表單的遠程副本看起來像是從您的服務器提交的。

處理遠程表單提交更好的方式是,根據一個惟一的字符串或時間戳生成一個令牌,並將這個令牌放在會話變量和表單中。提交表單之後,檢查兩個令牌是否匹配。如果不匹配,就知道有人試圖從表單的遠程副本發送數據。

PHP網站開發安全總結:

使用 mysql_real_escape_string() 防止 SQL 注入問題。

使用正則表達式和 strlen() 來確保 GET 數據未被篡改。

使用正則表達式和 strlen() 來確保用戶提交的數據不會使內存緩沖區溢出。

使用 strip_tags() 和 htmlspecialchars() 防止用戶提交可能有害的 HTML 標記。

避免系統被 Tamper Data 這樣的工具突破。

使用惟一的令牌防止用戶向服務器遠程提交表單。

本 文章可以幫助您馬上增加足夠的安全性,使當前項目更安全。 *
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved