日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql addslashes_PHP函数addslashes和mysql_real_escape_string的区别

發(fā)布時(shí)間:2023/12/10 数据库 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql addslashes_PHP函数addslashes和mysql_real_escape_string的区别 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

首先:不要使用mysql_escape_string,它已被棄用,請使用mysql_real_escape_string代替它。

mysql_real_escape_string和addslashes的區(qū)別在于:

區(qū)別一:addslashes不知道任何有關(guān)MySQL連接的字符集。如果你給所使用的MySQL連接傳遞一個(gè)包含字節(jié)編碼之外的其他編碼的字符串,它會很愉快地把所有值為字符‘、“、\和\x00的字節(jié)進(jìn)行轉(zhuǎn)義。如果你正在使用不同于8位和UTF-8的其它字符,這些字節(jié)的值不一定全部都是表示字符‘、“、\和\x00??赡茉斐傻慕Y(jié)果是,MySQL接收這些字符后出現(xiàn)錯(cuò)誤。

如果要修正這個(gè)bug,可嘗試使用iconv函數(shù),將變量轉(zhuǎn)為UTF-16,然后再使用addslashes進(jìn)行轉(zhuǎn)義。

這是不使用addslashes進(jìn)行轉(zhuǎn)義的原因之一。

區(qū)別二:

與addslashes對比,mysql_real_escape_string同時(shí)還對\r、\n和\x1a進(jìn)行轉(zhuǎn)義??磥?#xff0c;這些字符必須正確地告訴MySQL,否則會得到錯(cuò)誤的查詢結(jié)果。

這是不使用addslashes進(jìn)行轉(zhuǎn)義的另一個(gè)原因。

addslashes V.S. mysql_real_escape_string

在GBK里,0xbf27不是一個(gè)合法的多字符字符,但0xbf5c卻是。在單字節(jié)環(huán)境里,0xbf27被視為0xbf后面跟著0×27(‘),同時(shí)0xbf5c被視為0xbf后面跟著0x5c(\)。

一個(gè)用反斜杠轉(zhuǎn)義的單引號,是無法有效阻止針對MySQL的SQL注入攻擊的。如果你使用addslashes,那么,我(攻擊者,下同)是很幸運(yùn)的。我只要注入一些類似0xbf27,然后addslashes將它修改為0xbf5c27,一個(gè)合法的多字節(jié)字符后面接著一個(gè)單引號。換句話說,我可以無視你的轉(zhuǎn)義,成功地注入一個(gè)單引號。這是因?yàn)?xbf5c被當(dāng)作單字節(jié)字符,而非雙字節(jié)。

在這個(gè)演示中,我將使用MySQL 5.0和PHP的mysqli擴(kuò)展。如果你想嘗試,請確保你使用GBK。

創(chuàng)建一個(gè)名為users的表:

代碼如下:

CREATE TABLEusers(

usernameVARCHAR(32) CHARACTER SETGBK,

passwordVARCHAR(32) CHARACTER SETGBK,PRIMARY KEY(username)

);

下面的代碼模擬只使用addslashes(或magic_quotes_gpc)對查詢數(shù)據(jù)進(jìn)行轉(zhuǎn)義時(shí)的情況:

代碼如下:

<?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,我還是可以在不知道用戶名和密碼的情況下成功登錄。我可以輕松的利用這個(gè)漏洞進(jìn)行SQL注入。

要以免這種漏洞,使用mysql_real_escape_string、準(zhǔn)備語句(Prepared Statements,即“參數(shù)化查詢”)或者任意一款主流的數(shù)據(jù)庫抽象類庫。

總結(jié)

以上是生活随笔為你收集整理的mysql addslashes_PHP函数addslashes和mysql_real_escape_string的区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。