PHP與SQL注入攻擊[三]
更新時(shí)間:2007年04月17日 00:00:00 作者:
這幾天太忙,繼續(xù)連載哈哈,爭取半個(gè)月結(jié)束。
上文說到數(shù)據(jù)庫自帶的不安全輸入過濾功能,但這樣的功能不是所有數(shù)據(jù)庫都有的。目前大概只有MySQL,SQLite,PostgreSQL,Sybase帶有這樣的功能,而包括Oracle和SQL Server在內(nèi)的很多數(shù)據(jù)庫都沒有。
鑒于這樣的情況,一般開發(fā)者采用一種通用的方法來避免不安全的數(shù)據(jù)寫入數(shù)據(jù)庫--base64編碼。這樣可以避免所有可能引起問題的特殊字符造成的危險(xiǎn)。但Base64編碼后的數(shù)據(jù)容量大概會增加33%,比較占用空間。在PostgreSQL中,使用Base64編碼數(shù)據(jù)還有個(gè)問題,就是無法使用'LIKE'查詢。
所以總結(jié)這么多,我們知道光靠數(shù)據(jù)庫自身的字符串屏蔽也是不行的。我們需要一種解決方案,在特殊字符影響到我們的Query語句之前,就把危險(xiǎn)的字符過濾掉。預(yù)定義查詢(Prepared queries/prepared statements)是一個(gè)非常好的方法。什么是預(yù)定義查詢呢? 它就相當(dāng)于一個(gè)查詢語句的模板,定義了查詢語句的結(jié)構(gòu)和某些部份的數(shù)據(jù)類型。如果我們提交的SQL語句符合這個(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之外的所有字符都是占位符,不允許更改。呵呵,我覺得這種方法實(shí)在是個(gè)好方法。不過可惜不是所有數(shù)據(jù)庫都支持。。
上文說到數(shù)據(jù)庫自帶的不安全輸入過濾功能,但這樣的功能不是所有數(shù)據(jù)庫都有的。目前大概只有MySQL,SQLite,PostgreSQL,Sybase帶有這樣的功能,而包括Oracle和SQL Server在內(nèi)的很多數(shù)據(jù)庫都沒有。
鑒于這樣的情況,一般開發(fā)者采用一種通用的方法來避免不安全的數(shù)據(jù)寫入數(shù)據(jù)庫--base64編碼。這樣可以避免所有可能引起問題的特殊字符造成的危險(xiǎn)。但Base64編碼后的數(shù)據(jù)容量大概會增加33%,比較占用空間。在PostgreSQL中,使用Base64編碼數(shù)據(jù)還有個(gè)問題,就是無法使用'LIKE'查詢。
所以總結(jié)這么多,我們知道光靠數(shù)據(jù)庫自身的字符串屏蔽也是不行的。我們需要一種解決方案,在特殊字符影響到我們的Query語句之前,就把危險(xiǎn)的字符過濾掉。預(yù)定義查詢(Prepared queries/prepared statements)是一個(gè)非常好的方法。什么是預(yù)定義查詢呢? 它就相當(dāng)于一個(gè)查詢語句的模板,定義了查詢語句的結(jié)構(gòu)和某些部份的數(shù)據(jù)類型。如果我們提交的SQL語句符合這個(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之外的所有字符都是占位符,不允許更改。呵呵,我覺得這種方法實(shí)在是個(gè)好方法。不過可惜不是所有數(shù)據(jù)庫都支持。。
您可能感興趣的文章:
相關(guān)文章
PHPStorm+Xdebug進(jìn)行emote Debug時(shí)無法進(jìn)入斷點(diǎn)問題排查
這篇文章主要介紹了PHPStorm+Xdebug進(jìn)行emote Debug時(shí)無法進(jìn)入斷點(diǎn)問題排查,遇到類似問題的同學(xué),可以詳細(xì)參考下2021-04-04
php設(shè)計(jì)模式 Decorator(裝飾模式)
動態(tài)的給一個(gè)對象添加一些額外的職責(zé),就擴(kuò)展功能而言比生成子類方式更為靈活2011-06-06
探討多鍵值cookie(php中cookie存取數(shù)組)的詳解
本篇文章是對多鍵值cookie(php中cookie存取數(shù)組)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
PHP7實(shí)現(xiàn)和CryptoJS的AES加密方式互通示例【AES-128-ECB加密】
這篇文章主要介紹了PHP7實(shí)現(xiàn)和CryptoJS的AES加密方式互通操作,結(jié)合實(shí)例形式分析了PHP AES-128-ECB加密算法相關(guān)使用技巧,需要的朋友可以參考下2019-06-06

