PHP函數(shù)addslashes和mysql_real_escape_string的區(qū)別
首先:不要使用mysql_escape_string,它已被棄用,請使用mysql_real_escape_string代替它。
mysql_real_escape_string和addslashes的區(qū)別在于:
區(qū)別一:
addslashes不知道任何有關(guān)MySQL連接的字符集。如果你給所使用的MySQL連接傳遞一個包含字節(jié)編碼之外的其他編碼的字符串,它會很愉快地把所有值為字符‘、“、\和\x00的字節(jié)進行轉(zhuǎn)義。如果你正在使用不同于8位和UTF-8的其它字符,這些字節(jié)的值不一定全部都是表示字符‘、“、\和\x00。可能造成的結(jié)果是,MySQL接收這些字符后出現(xiàn)錯誤。
如果要修正這個bug,可嘗試使用iconv函數(shù),將變量轉(zhuǎn)為UTF-16,然后再使用addslashes進行轉(zhuǎn)義。
這是不使用addslashes進行轉(zhuǎn)義的原因之一。
區(qū)別二:
與addslashes對比,mysql_real_escape_string同時還對\r、\n和\x1a進行轉(zhuǎn)義??磥?,這些字符必須正確地告訴MySQL,否則會得到錯誤的查詢結(jié)果。
這是不使用addslashes進行轉(zhuǎn)義的另一個原因。
addslashes V.S. mysql_real_escape_string
在GBK里,0xbf27不是一個合法的多字符字符,但0xbf5c卻是。在單字節(jié)環(huán)境里,0xbf27被視為0xbf后面跟著0×27(‘),同時0xbf5c被視為0xbf后面跟著0x5c(\)。
一個用反斜杠轉(zhuǎn)義的單引號,是無法有效阻止針對MySQL的SQL注入攻擊的。如果你使用addslashes,那么,我(攻擊者,下同)是很幸運的。我只要注入一些類似0xbf27,然后addslashes將它修改為0xbf5c27,一個合法的多字節(jié)字符后面接著一個單引號。換句話說,我可以無視你的轉(zhuǎn)義,成功地注入一個單引號。這是因為0xbf5c被當作單字節(jié)字符,而非雙字節(jié)。
在這個演示中,我將使用MySQL 5.0和PHP的mysqli擴展。如果你想嘗試,請確保你使用GBK。
創(chuàng)建一個名為users的表:
CREATE TABLE users(
username VARCHAR(32) CHARACTER SET GBK,
password VARCHAR(32) CHARACTER SET GBK,
PRIMARY KEY(username)
);
下面的代碼模擬只使用addslashes(或magic_quotes_gpc)對查詢數(shù)據(jù)進行轉(zhuǎn)義時的情況:
<?php
$mysql = array();
$db = mysqli_init();
$db->real_connect('localhost', 'lorui', 'lorui.com', 'lorui_db');
/* SQL注入示例 */
$_POST['username'] = chr(0xbf) . chr(0×27) . ‘ OR username = username /*'; $_POST['password'] = ‘guess'; $mysql['username'] = addslashes($_POST['username']); $mysql['password'] = addslashes($_POST['password']); $sql = “SELECT * FROM users WHERE username = ‘{$mysql['username']}' AND password = ‘{$mysql['password']}'”; $result = $db->query($sql); if ($result->num_rows) { /* 成功 */ } else { /* 失敗 */ }
盡管使用了addslashes,我還是可以在不知道用戶名和密碼的情況下成功登錄。我可以輕松的利用這個漏洞進行SQL注入。
要以免這種漏洞,使用mysql_real_escape_string、準備語句(Prepared Statements,即“參數(shù)化查詢”)或者任意一款主流的數(shù)據(jù)庫抽象類庫。
- PHP中的MYSQL常用函數(shù)(php下操作數(shù)據(jù)庫必備)
- 解析php session_set_save_handler 函數(shù)的用法(mysql)
- php Mysql日期和時間函數(shù)集合
- php empty函數(shù)判斷mysql表單是否為空
- PHP訪問MYSQL數(shù)據(jù)庫封裝類(附函數(shù)說明)
- PHP持久連接mysql_pconnect()函數(shù)使用介紹
- PHP操作mysql函數(shù)詳解,mysql和php交互函數(shù)
- php中使用session_set_save_handler()函數(shù)把session保存到MySQL數(shù)據(jù)庫實例
- Zend studio for eclipse中使php可以調(diào)用mysql相關(guān)函數(shù)的設(shè)置方法
- php mysql_real_escape_string函數(shù)用法與實例教程
- PHP mysqli_free_result()與mysqli_fetch_array()函數(shù)詳解
- PHP_MySQL教程-第三天 基本函數(shù)
- PHP操作MySQL的mysql_fetch_* 函數(shù)的常見用法教程
- php mysql_list_dbs()函數(shù)用法示例
相關(guān)文章
Thinkphp5+Redis實現(xiàn)商品秒殺代碼實例講解
這篇文章主要介紹了Thinkphp5+Redis實現(xiàn)商品秒殺代碼實例講解,代碼和步驟講解的很清楚,有需要的同學可以借鑒參考下2020-12-12ThinkPHP5.0框架實現(xiàn)切換數(shù)據(jù)庫的方法分析
這篇文章主要介紹了ThinkPHP5.0框架實現(xiàn)切換數(shù)據(jù)庫的方法,結(jié)合實例形式分析了thinkPHP5.0數(shù)據(jù)庫的配置與動態(tài)連接相關(guān)操作技巧,需要的朋友可以參考下2019-10-10PHP設(shè)計模式之工廠模式(Factory)入門與應用詳解
這篇文章主要介紹了PHP設(shè)計模式之工廠模式(Factory),結(jié)合實例形式詳細分析了PHP工廠模式的概念、原理、基本應用與相關(guān)操作注意事項,需要的朋友可以參考下2019-12-12