PHP與SQL注入攻擊[三]
更新時(shí)間:2007年04月17日 00:00:00 作者:
這幾天太忙,繼續(xù)連載哈哈,爭(zhēng)取半個(gè)月結(jié)束。
上文說(shuō)到數(shù)據(jù)庫(kù)自帶的不安全輸入過(guò)濾功能,但這樣的功能不是所有數(shù)據(jù)庫(kù)都有的。目前大概只有MySQL,SQLite,PostgreSQL,Sybase帶有這樣的功能,而包括Oracle和SQL Server在內(nèi)的很多數(shù)據(jù)庫(kù)都沒(méi)有。
鑒于這樣的情況,一般開(kāi)發(fā)者采用一種通用的方法來(lái)避免不安全的數(shù)據(jù)寫(xiě)入數(shù)據(jù)庫(kù)--base64編碼。這樣可以避免所有可能引起問(wèn)題的特殊字符造成的危險(xiǎn)。但Base64編碼后的數(shù)據(jù)容量大概會(huì)增加33%,比較占用空間。在PostgreSQL中,使用Base64編碼數(shù)據(jù)還有個(gè)問(wèn)題,就是無(wú)法使用'LIKE'查詢。
所以總結(jié)這么多,我們知道光靠數(shù)據(jù)庫(kù)自身的字符串屏蔽也是不行的。我們需要一種解決方案,在特殊字符影響到我們的Query語(yǔ)句之前,就把危險(xiǎn)的字符過(guò)濾掉。預(yù)定義查詢(Prepared queries/prepared statements)是一個(gè)非常好的方法。什么是預(yù)定義查詢呢? 它就相當(dāng)于一個(gè)查詢語(yǔ)句的模板,定義了查詢語(yǔ)句的結(jié)構(gòu)和某些部份的數(shù)據(jù)類型。如果我們提交的SQL語(yǔ)句符合這個(gè)模板的定義,就執(zhí)行,否則就不執(zhí)行,報(bào)出錯(cuò)誤。
例如:
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 ..定義了一個(gè)查詢的格式,這里除了$1之外的所有字符都是占位符,不允許更改。呵呵,我覺(jué)得這種方法實(shí)在是個(gè)好方法。不過(guò)可惜不是所有數(shù)據(jù)庫(kù)都支持。。
上文說(shuō)到數(shù)據(jù)庫(kù)自帶的不安全輸入過(guò)濾功能,但這樣的功能不是所有數(shù)據(jù)庫(kù)都有的。目前大概只有MySQL,SQLite,PostgreSQL,Sybase帶有這樣的功能,而包括Oracle和SQL Server在內(nèi)的很多數(shù)據(jù)庫(kù)都沒(méi)有。
鑒于這樣的情況,一般開(kāi)發(fā)者采用一種通用的方法來(lái)避免不安全的數(shù)據(jù)寫(xiě)入數(shù)據(jù)庫(kù)--base64編碼。這樣可以避免所有可能引起問(wèn)題的特殊字符造成的危險(xiǎn)。但Base64編碼后的數(shù)據(jù)容量大概會(huì)增加33%,比較占用空間。在PostgreSQL中,使用Base64編碼數(shù)據(jù)還有個(gè)問(wèn)題,就是無(wú)法使用'LIKE'查詢。
所以總結(jié)這么多,我們知道光靠數(shù)據(jù)庫(kù)自身的字符串屏蔽也是不行的。我們需要一種解決方案,在特殊字符影響到我們的Query語(yǔ)句之前,就把危險(xiǎn)的字符過(guò)濾掉。預(yù)定義查詢(Prepared queries/prepared statements)是一個(gè)非常好的方法。什么是預(yù)定義查詢呢? 它就相當(dāng)于一個(gè)查詢語(yǔ)句的模板,定義了查詢語(yǔ)句的結(jié)構(gòu)和某些部份的數(shù)據(jù)類型。如果我們提交的SQL語(yǔ)句符合這個(gè)模板的定義,就執(zhí)行,否則就不執(zhí)行,報(bào)出錯(cuò)誤。
例如:
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 ..定義了一個(gè)查詢的格式,這里除了$1之外的所有字符都是占位符,不允許更改。呵呵,我覺(jué)得這種方法實(shí)在是個(gè)好方法。不過(guò)可惜不是所有數(shù)據(jù)庫(kù)都支持。。
您可能感興趣的文章:
- PHP防止注入攻擊實(shí)例分析
- PHP MYSQL注入攻擊需要預(yù)防7個(gè)要點(diǎn)
- 細(xì)談php中SQL注入攻擊與XSS攻擊
- PHP與SQL注入攻擊防范小技巧
- PHP+SQL 注入攻擊的技術(shù)實(shí)現(xiàn)以及預(yù)防辦法
- PHP+SQL 注入攻擊的技術(shù)實(shí)現(xiàn)以及預(yù)防辦法
- PHP中防止SQL注入攻擊和XSS攻擊的兩個(gè)簡(jiǎn)單方法
- PHP與SQL注入攻擊[二]
- PHP與SQL注入攻擊[一]
- php mysql_real_escape_string addslashes及mysql綁定參數(shù)防SQL注入攻擊
相關(guān)文章
PHP?trim函數(shù)對(duì)多字節(jié)字符的使用限制實(shí)例探究
這篇文章主要為大家介紹了PHP?trim函數(shù)對(duì)多字節(jié)字符的使用限制實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01PHP和JavaScrip分別獲取關(guān)聯(lián)數(shù)組的鍵值示例代碼
關(guān)聯(lián)數(shù)組的鍵值獲取,有很多方法,在本文為大家介紹下PHP和JavaScrip中時(shí)如何實(shí)現(xiàn)的,感興趣的朋友可以參考下2013-09-09PHP超級(jí)全局變量、魔術(shù)變量和魔術(shù)函數(shù)匯總整理
這篇文章主要介紹了PHP超級(jí)全局變量、魔術(shù)變量和魔術(shù)函數(shù)匯總整理,有需要的同學(xué)可以看下2021-02-02PHP封裝的數(shù)據(jù)庫(kù)模型Model類完整示例【基于PDO】
這篇文章主要介紹了PHP封裝的數(shù)據(jù)庫(kù)模型Model類,結(jié)合實(shí)例形式分析了php基于PDO針對(duì)mysql數(shù)據(jù)庫(kù)常見(jiàn)增刪改查、統(tǒng)計(jì)、判斷等相關(guān)操作封裝與使用技巧,需要的朋友可以參考下2019-03-03PHP 在5.1.* 和5.2.*之間 PDO數(shù)據(jù)庫(kù)操作中的不同之處小結(jié)
今天發(fā)現(xiàn)php5.1.*和php5.2.*在數(shù)據(jù)庫(kù)預(yù)編譯代碼執(zhí)行的時(shí)候出現(xiàn)差異2012-03-03php實(shí)現(xiàn)猴子選大王問(wèn)題算法實(shí)例
這篇文章主要介紹了php實(shí)現(xiàn)猴子選大王問(wèn)題算法,實(shí)例分析了算法的原理與解決方法,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-04-04