程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP與SQL注入攻擊[三]

PHP與SQL注入攻擊[三]

編輯:關於PHP編程

這幾天太忙,繼續連載哈哈,爭取半個月結束。

上文說到數據庫自帶的不安全輸入過濾功能,但這樣的功能不是所有數據庫都有的。目前大概只有MySQL,SQLite,PostgreSQL,Sybase帶有這樣的功能,而包括Oracle和SQL Server在內的很多數據庫都沒有。

鑒於這樣的情況,一般開發者采用一種通用的方法來避免不安全的數據寫入數據庫--base64編碼。這樣可以避免所有可能引起問題的特殊字符造成的危險。但Base64編碼後的數據容量大概會增加33%,比較占用空間。在PostgreSQL中,使用Base64編碼數據還有個問題,就是無法使用'LIKE'查詢。

所以總結這麼多,我們知道光靠數據庫自身的字符串屏蔽也是不行的。我們需要一種解決方案,在特殊字符影響到我們的Query語句之前,就把危險的字符過濾掉。預定義查詢(Prepared queries/prepared statements)是一個非常好的方法。什麼是預定義查詢呢? 它就相當於一個查詢語句的模板,定義了查詢語句的結構和某些部份的數據類型。如果我們提交的SQL語句符合這個模板的定義,就執行,否則就不執行,報出錯誤。

例如:

pg_query($conn, “PREPARE stmt_name (text) AS SELECT * FROM users WHERE name=$1”);
pg_query($conn, “EXECUTE stmt_name ({$name})”);
pg_query($conn, “DEALLOCATE stmt_name”);

PREPARE stmt_name (text) AS ..定義了一個查詢的格式,這裡除了$1之外的所有字符都是占位符,不允許更改。呵呵,我覺得這種方法實在是個好方法。不過可惜不是所有數據庫都支持。。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved