首頁  >  文章  >  後端開發  >  PHP網站常見攻擊方式

PHP網站常見攻擊方式

小云云
小云云原創
2018-03-26 10:18:384776瀏覽

PHP網站建置中常見的安全性威脅包括:SQL 注入、操縱 GET 和 POST 變數、緩衝區溢位攻擊、跨站點腳本攻擊、瀏覽器內的資料操縱和遠端表單提交。

1、防止SQL注入攻擊

在 SQL 注入攻擊 中,使用者透過操縱表單或 GET 查詢字串,將資訊加入資料庫查詢。

例如,假設有一個簡單的登入資料庫。這個資料庫中的每個記錄都有一個使用者名字段和一個密碼欄位。建立一個登入表單,讓使用者能夠登入。

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

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

2、防止使用者操縱變數

使用者擁有有效的密碼,並不代表他將按照規則行事 —— 他有很多機會可以造成損害。例如,應用程式可能允許用戶查看特殊的內容。

例如 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 這樣的工具突破。

使用惟一的令牌防止使用者向伺服器遠端提交表單。

相關推薦:

常見的PHP安全性攻擊及解決方法

解決php網站開發常見的幾種攻擊方法

PHP實作防止跨站和xss攻擊實例程式碼

以上是PHP網站常見攻擊方式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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