电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

PHP安全-SQL 注入

瀏覽:111日期:2022-09-12 09:24:55
SQL 注入

SQL 注入是PHP應(yīng)用中最常見的漏洞之一。事實(shí)上令人驚奇的是,開發(fā)者要同時(shí)犯兩個(gè)錯(cuò)誤才會(huì)引發(fā)一個(gè)SQL注入漏洞,一個(gè)是沒有對(duì)輸入的數(shù)據(jù)進(jìn)行過濾(過濾輸入),還有一個(gè)是沒有對(duì)發(fā)送到數(shù)據(jù)庫(kù)的數(shù)據(jù)進(jìn)行轉(zhuǎn)義(轉(zhuǎn)義輸出)。這兩個(gè)重要的步驟缺一不可,需要同時(shí)加以特別關(guān)注以減少程序錯(cuò)誤。

對(duì)于攻擊者來說,進(jìn)行SQL注入攻擊需要思考和試驗(yàn),對(duì)數(shù)據(jù)庫(kù)方案進(jìn)行有根有據(jù)的推理非常有必要(當(dāng)然假設(shè)攻擊者看不到你的源程序和數(shù)據(jù)庫(kù)方案),考慮以下簡(jiǎn)單的登錄表單:

CODE:

<form action='/login.php' method='POST'>

<p>Username: <input type='text' name='username' /></p>

<p>Password: <input type='password' name='password' /></p>

<p><input type='submit' value='Log In' /></p>

</form>

圖 3-1 給出了該表單在瀏覽器中的顯示。

作為一個(gè)攻擊者,他會(huì)從推測(cè)驗(yàn)證用戶名和密碼的查詢語(yǔ)句開始。通過查看源文件,他就能開始猜測(cè)你的習(xí)慣。

圖 3-1. 登錄表單在瀏覽器中的顯示

命名習(xí)慣。通常會(huì)假設(shè)你表單中的字段名為與數(shù)據(jù)表中的字段名相同。當(dāng)然,確保它們不同未必是一個(gè)可靠的安全措施。

第一次猜測(cè),一般會(huì)使用下面例子中的查詢:

CODE:

<?php

$password_hash = md5($_POST[’password’]);

$sql = 'SELECT count(*)

FROM users

WHERE username = ’{$_POST[’username’]}’

AND password = ’$password_hash’';

?>

使用用戶密碼的MD5值原來是一個(gè)通行的做法,但現(xiàn)在并不是特別安全了。最近的研究表明MD5算法有缺陷,而且大量MD5數(shù)據(jù)庫(kù)降低了MD5反向破解的難度。請(qǐng)?jiān)L問http://md5.rednoize.com/ 查看演示。

譯注:原文如此,山東大學(xué)教授王小云的研究表明可以很快的找到MD5的“碰撞”,就是可以產(chǎn)生相同的MD5值的不同兩個(gè)文件和字串。MD5是信息摘要算法,而不是加密算法,反向破解也就無從談起了。不過根據(jù)這個(gè)成果,在上面的特例中,直接使用md5是危險(xiǎn)的。

最好的保護(hù)方法是在密碼上附加一個(gè)你自己定義的字符串,例如:

CODE:

<?php

$salt = ’SHIFLETT’;

$password_hash = md5($salt . md5($_POST[’password’] . $salt));

?>

當(dāng)然,攻擊者未必在第一次就能猜中,他們常常還需要做一些試驗(yàn)。有一個(gè)比較好的試驗(yàn)方式是把單引號(hào)作為用戶名錄入,原因是這樣可能會(huì)暴露一些重要信息。有很多開發(fā)人員在Mysql語(yǔ)句執(zhí)行出錯(cuò)時(shí)會(huì)調(diào)用函數(shù)mysql_error()來報(bào)告錯(cuò)誤。見下面的例子:

CODE:

<?php

mysql_query($sql) or exit(mysql_error());

?>

雖然該方法在開發(fā)中十分有用,但它能向攻擊者暴露重要信息。如果攻擊者把單引號(hào)做為用戶名,mypass做為密碼,查詢語(yǔ)句就會(huì)變成:

CODE:

<?php

$sql = 'SELECT *

FROM users

WHERE username = ’’’

AND password = ’a029d0df84eb5549c641e04a9ef389e5’';

?>

當(dāng)該語(yǔ)句發(fā)送到MySQL后,系統(tǒng)就會(huì)顯示如下錯(cuò)誤信息:

You have an error in your SQL syntax. Check the manual that corresponds to your

MySQL server version for the right syntax to use near ’WHERE username = ’’’ AND

password = ’a029d0df84eb55

不費(fèi)吹灰之力,攻擊者已經(jīng)知道了兩個(gè)字段名(username和password)以及他們出現(xiàn)在查詢中的順序。除此以外,攻擊者還知道了數(shù)據(jù)沒有正確進(jìn)行過濾(程序沒有提示非法用戶名)和轉(zhuǎn)義(出現(xiàn)了數(shù)據(jù)庫(kù)錯(cuò)誤),同時(shí)整個(gè)WHERE條件的格式也暴露了,這樣,攻擊者就可以嘗試操縱符合查詢的記錄了。

在這一點(diǎn)上,攻擊者有很多選擇。一是嘗試填入一個(gè)特殊的用戶名,以使查詢無論用戶名密碼是否符合,都能得到匹配:

myuser’ or ’foo’ = ’foo’ --

假定將mypass作為密碼,整個(gè)查詢就會(huì)變成:

CODE:

<?php

$sql = 'SELECT *

FROM users

WHERE username = ’myuser’ or ’foo’ = ’foo’ --

AND password = ’a029d0df84eb5549c641e04a9ef389e5’';

?>

由于中間插入了一個(gè)SQL注釋標(biāo)記,所以查詢語(yǔ)句會(huì)在此中斷。這就允許了一個(gè)攻擊者在不知道任何合法用戶名和密碼的情況下登錄。

如果知道合法的用戶名,攻擊者就可以該用戶(如chris)身份登錄:

chris’ --

只要chris是合法的用戶名,攻擊者就可以控制該帳號(hào)。原因是查詢變成了下面的樣子:

CODE:

<?php

$sql = 'SELECT *

FROM users

WHERE username = ’chris’ --

AND password = ’a029d0df84eb5549c641e04a9ef389e5’';

?>

幸運(yùn)的是,SQL注入是很容易避免的。正如第一章所提及的,你必須堅(jiān)持過濾輸入和轉(zhuǎn)義輸出。

雖然兩個(gè)步驟都不能省略,但只要實(shí)現(xiàn)其中的一個(gè)就能消除大多數(shù)的SQL注入風(fēng)險(xiǎn)。如果你只是過濾輸入而沒有轉(zhuǎn)義輸出,你很可能會(huì)遇到數(shù)據(jù)庫(kù)錯(cuò)誤(合法的數(shù)據(jù)也可能影響SQL查詢的正確格式),但這也不可靠,合法的數(shù)據(jù)還可能改變SQL語(yǔ)句的行為。另一方面,如果你轉(zhuǎn)義了輸出,而沒有過濾輸入,就能保證數(shù)據(jù)不會(huì)影響SQL語(yǔ)句的格式,同時(shí)也防止了多種常見SQL注入攻擊的方法。

當(dāng)然,還是要堅(jiān)持同時(shí)使用這兩個(gè)步驟。過濾輸入的方式完全取決于輸入數(shù)據(jù)的類型(見第一章的示例),但轉(zhuǎn)義用于向數(shù)據(jù)庫(kù)發(fā)送的輸出數(shù)據(jù)只要使用同一個(gè)函數(shù)即可。對(duì)于MySQL用戶,可以使用函數(shù)mysql_real_escape_string( ):

CODE:

<?php

$clean = array();

$mysql = array();

$clean[’last_name’] = 'O’Reilly';

$mysql[’last_name’] = mysql_real_escape_string($clean[’last_name’]);

$sql = 'INSERT

INTO user (last_name)

VALUES (’{$mysql[’last_name’]}’)';

?>

盡量使用為你的數(shù)據(jù)庫(kù)設(shè)計(jì)的轉(zhuǎn)義函數(shù)。如果沒有,使用函數(shù)addslashes( )是最終的比較好的方法。

當(dāng)所有用于建立一個(gè)SQL語(yǔ)句的數(shù)據(jù)被正確過濾和轉(zhuǎn)義時(shí),實(shí)際上也就避免了SQL注入的風(fēng)險(xiǎn)。

CODE:

如果你正在使用支持參數(shù)化查詢語(yǔ)句和占位符的數(shù)據(jù)庫(kù)操作類(如PEAR::DB, PDO等),你就會(huì)多得到一層保護(hù)。見下面的使用PEAR::DB的例子:

CODE:

<?php

$sql = ’INSERT

INTO user (last_name)

VALUES (?)’;

$dbh->query($sql, array($clean[’last_name’]));

?>

CODE:

由于在上例中數(shù)據(jù)不能直接影響查詢語(yǔ)句的格式,SQL注入的風(fēng)險(xiǎn)就降低了。PEAR::DB會(huì)自動(dòng)根據(jù)你的數(shù)據(jù)庫(kù)的要求進(jìn)行轉(zhuǎn)義,所以你只需要過濾輸出即可。

如果你正在使用參數(shù)化查詢語(yǔ)句,輸入的內(nèi)容就只會(huì)作為數(shù)據(jù)來處理。這樣就沒有必要進(jìn)行轉(zhuǎn)義了,盡管你可能認(rèn)為這是必要的一步(如果你希望堅(jiān)持轉(zhuǎn)義輸出習(xí)慣的話)。實(shí)際上,這時(shí)是否轉(zhuǎn)義基本上不會(huì)產(chǎn)生影響,因?yàn)檫@時(shí)沒有特殊字符需要轉(zhuǎn)換。在防止SQL注入這一點(diǎn)上,參數(shù)化查詢語(yǔ)句為你的程序提供了強(qiáng)大的保護(hù)。

譯注:關(guān)于SQL注入,不得不說的是現(xiàn)在大多虛擬主機(jī)都會(huì)把magic_quotes_gpc選項(xiàng)打開,在這種情況下所有的客戶端GET和POST的數(shù)據(jù)都會(huì)自動(dòng)進(jìn)行addslashes處理,所以此時(shí)對(duì)字符串值的SQL注入是不可行的,但要防止對(duì)數(shù)字值的SQL注入,如用intval()等函數(shù)進(jìn)行處理。但如果你編寫的是通用軟件,則需要讀取服務(wù)器的magic_quotes_gpc后進(jìn)行相應(yīng)處理。

標(biāo)簽: PHP
相關(guān)文章:
主站蜘蛛池模板: 北京成考网-北京成人高考网| 伸缩节_伸缩器_传力接头_伸缩接头_巩义市联通管道厂 | 北京征地律师,征地拆迁律师,专业拆迁律师,北京拆迁律师,征地纠纷律师,征地诉讼律师,征地拆迁补偿,拆迁律师 - 北京凯诺律师事务所 | 交变/复合盐雾试验箱-高低温冲击试验箱_安奈设备产品供应杭州/江苏南京/安徽马鞍山合肥等全国各地 | 钣金加工厂家-钣金加工-佛山钣金厂-月汇好| 上海平衡机-单面卧式动平衡机-万向节动平衡机-圈带动平衡机厂家-上海申岢动平衡机制造有限公司 | 行业分析:提及郑州火车站附近真有 特殊按摩 ?2025实地踩坑指南 新手如何避坑不踩雷 | 【ph计】|在线ph计|工业ph计|ph计厂家|ph计价格|酸度计生产厂家_武汉吉尔德科技有限公司 | 插针变压器-家用电器变压器-工业空调变压器-CD型电抗器-余姚市中驰电器有限公司 | 灌装封尾机_胶水灌装机_软管灌装封尾机_无锡和博自动化机械制造有限公司 | 冷轧机|两肋冷轧机|扁钢冷轧机|倒立式拉丝机|钢筋拔丝机|收线机-巩义市华瑞重工机械制造有限公司 | 冻干机(冷冻干燥机)_小型|实验型|食品真空冷冻干燥机-松源 | 脑钠肽-白介素4|白介素8试剂盒-研域(上海)化学试剂有限公司 | 仿古建筑设计-仿古建筑施工-仿古建筑公司-汉匠古建筑设计院 | 耐酸泵,耐酸泵厂家-淄博华舜耐腐蚀真空泵 | 过跨车_过跨电瓶车_过跨转运车_横移电动平车_厂区转运车_无轨转运车 | 空气能暖气片,暖气片厂家,山东暖气片,临沂暖气片-临沂永超暖通设备有限公司 | 湖南自考_湖南自学考试网| 高硼硅玻璃|水位计玻璃板|光学三棱镜-邯郸奥维玻璃科技有限公司 高温高压釜(氢化反应釜)百科 | 卫浴散热器,卫浴暖气片,卫生间背篓暖气片,华圣格浴室暖气片 | 北京自然绿环境科技发展有限公司专业生产【洗车机_加油站洗车机-全自动洗车机】 | 电主轴,车床电磨头,变频制动电机-博山鸿达特种电机 | 中宏网-今日新闻-财经新闻 | 优考试_免费在线考试系统_培训考试系统_题库系统_组卷答题系统_匡优考试 | 盘古网络技术有限公司| 塑胶跑道施工-硅pu篮球场施工-塑胶网球场建造-丙烯酸球场材料厂家-奥茵 | 中高频感应加热设备|高频淬火设备|超音频感应加热电源|不锈钢管光亮退火机|真空管烤消设备 - 郑州蓝硕工业炉设备有限公司 | 全自动烧卖机厂家_饺子机_烧麦机价格_小笼汤包机_宁波江北阜欣食品机械有限公司 | 钢衬四氟管道_钢衬四氟直管_聚四氟乙烯衬里管件_聚四氟乙烯衬里管道-沧州汇霖管道科技有限公司 | 环氧乙烷灭菌器_压力蒸汽灭菌器_低温等离子过氧化氢灭菌器 _低温蒸汽甲醛灭菌器_清洗工作站_医用干燥柜_灭菌耗材-环氧乙烷灭菌器_脉动真空压力蒸汽灭菌器_低温等离子灭菌设备_河南省三强医疗器械有限责任公司 | 产业规划_产业园区规划-产业投资选址及规划招商托管一体化服务商-中机院产业园区规划网 | 深圳成考网-深圳成人高考报名网 深圳工程师职称评定条件及流程_深圳职称评审_职称评审-职称网 | 无压烧结银_有压烧结银_导电银胶_导电油墨_导电胶-善仁(浙江)新材料 | 酒店品牌设计-酒店vi设计-酒店标识设计【国际级】VI策划公司 | 氧化锆陶瓷_氧化锆陶瓷加工_氧化锆陶瓷生产厂家-康柏工业陶瓷有限公司 | 台式恒温摇床价格_大容量恒温摇床厂家-上海量壹科学仪器有限公司 | 石磨面粉机|石磨面粉机械|石磨面粉机组|石磨面粉成套设备-河南成立粮油机械有限公司 | 破碎机锤头_合金耐磨锤头_郑州宇耐机械工程技术有限公司 | 专业甜品培训学校_广东糖水培训_奶茶培训_特色小吃培训_广州烘趣甜品培训机构 | 冰雕-冰雪世界-大型冰雕展制作公司-赛北冰雕官网 | 锡膏喷印机-全自动涂覆机厂家-全自动点胶机-视觉点胶机-深圳市博明智控科技有限公司 |