日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

PHP安全-SQL 注入

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

SQL 注入是PHP應用中最常見的漏洞之一。事實上令人驚奇的是,開發者要同時犯兩個錯誤才會引發一個SQL注入漏洞,一個是沒有對輸入的數據進行過濾(過濾輸入),還有一個是沒有對發送到數據庫的數據進行轉義(轉義輸出)。這兩個重要的步驟缺一不可,需要同時加以特別關注以減少程序錯誤。

對于攻擊者來說,進行SQL注入攻擊需要思考和試驗,對數據庫方案進行有根有據的推理非常有必要(當然假設攻擊者看不到你的源程序和數據庫方案),考慮以下簡單的登錄表單:

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 給出了該表單在瀏覽器中的顯示。

作為一個攻擊者,他會從推測驗證用戶名和密碼的查詢語句開始。通過查看源文件,他就能開始猜測你的習慣。

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

命名習慣。通常會假設你表單中的字段名為與數據表中的字段名相同。當然,確保它們不同未必是一個可靠的安全措施。

第一次猜測,一般會使用下面例子中的查詢:

CODE:

<?php

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

$sql = 'SELECT count(*)

FROM users

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

AND password = ’$password_hash’';

?>

使用用戶密碼的MD5值原來是一個通行的做法,但現在并不是特別安全了。最近的研究表明MD5算法有缺陷,而且大量MD5數據庫降低了MD5反向破解的難度。請訪問http://md5.rednoize.com/ 查看演示。

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

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

CODE:

<?php

$salt = ’SHIFLETT’;

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

?>

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

CODE:

<?php

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

?>

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

CODE:

<?php

$sql = 'SELECT *

FROM users

WHERE username = ’’’

AND password = ’a029d0df84eb5549c641e04a9ef389e5’';

?>

當該語句發送到MySQL后,系統就會顯示如下錯誤信息:

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

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

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

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

假定將mypass作為密碼,整個查詢就會變成:

CODE:

<?php

$sql = 'SELECT *

FROM users

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

AND password = ’a029d0df84eb5549c641e04a9ef389e5’';

?>

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

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

chris’ --

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

CODE:

<?php

$sql = 'SELECT *

FROM users

WHERE username = ’chris’ --

AND password = ’a029d0df84eb5549c641e04a9ef389e5’';

?>

幸運的是,SQL注入是很容易避免的。正如第一章所提及的,你必須堅持過濾輸入和轉義輸出。

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

當然,還是要堅持同時使用這兩個步驟。過濾輸入的方式完全取決于輸入數據的類型(見第一章的示例),但轉義用于向數據庫發送的輸出數據只要使用同一個函數即可。對于MySQL用戶,可以使用函數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’]}’)';

?>

盡量使用為你的數據庫設計的轉義函數。如果沒有,使用函數addslashes( )是最終的比較好的方法。

當所有用于建立一個SQL語句的數據被正確過濾和轉義時,實際上也就避免了SQL注入的風險。

CODE:

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

CODE:

<?php

$sql = ’INSERT

INTO user (last_name)

VALUES (?)’;

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

?>

CODE:

由于在上例中數據不能直接影響查詢語句的格式,SQL注入的風險就降低了。PEAR::DB會自動根據你的數據庫的要求進行轉義,所以你只需要過濾輸出即可。

如果你正在使用參數化查詢語句,輸入的內容就只會作為數據來處理。這樣就沒有必要進行轉義了,盡管你可能認為這是必要的一步(如果你希望堅持轉義輸出習慣的話)。實際上,這時是否轉義基本上不會產生影響,因為這時沒有特殊字符需要轉換。在防止SQL注入這一點上,參數化查詢語句為你的程序提供了強大的保護。

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

標簽: PHP
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美成人亚洲| 国产毛片久久| 日韩一二三区在线观看| 久久国产精品久久w女人spa| 中文国产一区| 中文字幕日韩高清在线| 国产欧美日韩精品一区二区免费| 久久精品av麻豆的观看方式| 久久精品超碰| 精品视频在线你懂得| 日本不良网站在线观看| 黄色成人91| 国产伦精品一区二区三区千人斩| 久久久精品网| 视频一区视频二区中文字幕| 亚洲久久视频| 久久av资源| 成人日韩在线| 亚洲一级淫片| 精品99在线| 黄色精品网站| 国产麻豆一区| 在线日韩欧美| 日韩超碰人人爽人人做人人添| 成人午夜在线| 久久高清一区| 久久一区精品| 亚洲高清二区| 青青草精品视频| 日韩欧美字幕| 日本一区二区中文字幕| 亚洲天堂资源| 中文字幕一区二区三区在线视频| 你懂的国产精品| 婷婷综合五月| 在线中文字幕播放| 国产一区二区精品福利地址| 欧美精品激情| 国产精品欧美在线观看| 999精品色在线播放| 日韩国产欧美一区二区三区| 日韩88av| 蜜臀国产一区二区三区在线播放| 国产伦理一区| 久久国产精品亚洲77777| 精品精品99| 综合一区二区三区| 久久美女性网| 久久精品毛片| 亚洲综合中文| 国产成人精品亚洲日本在线观看| 亚洲综合色婷婷在线观看| 国产精品99久久精品| 亚洲欧美网站在线观看| 日韩免费福利视频| 欧美日韩亚洲国产精品| 91成人网在线观看| 91亚洲国产成人久久精品| 综合激情在线| 久久麻豆精品| 岛国av在线播放| 国产日韩视频| 免费一区二区视频| 999精品一区| 国产中文欧美日韩在线| 日韩精品高清不卡| 国产视频一区欧美| 国产福利91精品一区二区| 亚洲精品高潮| 亚洲欧美日韩在线观看a三区| 亚洲啊v在线| 久久精品五月| 国产精品久久久久久久久妇女| 精品视频99| 日韩三级视频| 欧美日韩四区| 激情久久五月| 中文在线资源| 九九久久国产| 国产精品激情| 国产精品第十页| 欧美有码在线| 久久狠狠久久| 国产精品成人国产| 国产精品成人3p一区二区三区| 欧美日韩一区二区高清| 亚洲精品三级| 亚州精品视频| 怡红院精品视频在线观看极品| 蜜桃av.网站在线观看| 国产成人精品亚洲线观看| 久久精品欧洲| 国产一区调教| 国产v综合v| 亚洲精品国产嫩草在线观看| 国产精品99久久精品| 久久久久久久欧美精品| 电影亚洲精品噜噜在线观看| 国内一区二区三区| 日韩成人精品一区二区| 国产一区二区三区四区大秀| 久久99国产精品视频| 精品一区二区三区亚洲| 精品一区二区三区亚洲| 红杏一区二区三区| 日本免费久久| 日韩激情一区| 91精品99| 亚洲网址在线观看| 日本aⅴ亚洲精品中文乱码 | 福利一区和二区| 91av亚洲| 亚洲激情二区| 日韩精品一区二区三区av| 国产精品一区二区美女视频免费看 | 国内精品伊人| 中文在线中文资源| 亚洲第一区色| 亚洲另类视频| 精品亚洲成人| 欧美va天堂在线| 美国三级日本三级久久99| 日韩福利在线观看| 国产96在线亚洲| 欧美在线观看视频一区| 亚洲天堂av资源在线观看| 国产精品chinese| 久久久国产亚洲精品| 免费在线看一区| 捆绑调教美女网站视频一区| 欧美日韩一二三四| 日韩精品一区第一页| 亚洲精品国产精品粉嫩| 久久福利在线| 久久精品亚洲人成影院| 亚洲久久视频| 福利一区二区| 国产手机视频一区二区 | 青青伊人久久| 国产美女高潮在线观看| 免费高清在线一区| 欧美激情视频一区二区三区免费 | 日韩不卡在线| 日本va欧美va瓶| 日韩av首页| 久久精品 人人爱| 欧美中文字幕一区二区| 日韩三级一区| 日韩国产欧美| 亚洲精品伊人| 亚洲黄色免费av| 亚洲精品在线国产| 亚洲综合在线电影| 国产日韩亚洲| 日韩视频在线一区二区三区| 欧美国产精品| 国产精品视区| 成午夜精品一区二区三区软件| 久久午夜影视| 久久久久国产精品一区二区| 欧美日本三区| 夜夜嗨av一区二区三区网站四季av| 日韩精品国产欧美| 美女少妇全过程你懂的久久| 欧美日韩亚洲一区二区三区在线| 美女亚洲一区| 成人亚洲一区| 日本免费一区二区视频| 亚洲网站视频| 成人国产精品一区二区网站| 日本aⅴ精品一区二区三区| 久久久久网站| 久久精品国产99国产| 亚洲区第一页| 日韩视频二区| 久久久夜夜夜| 国产一区二区三区成人欧美日韩在线观看 | 亚洲午夜在线| 国产成人77亚洲精品www| 日本91福利区| 在线国产日韩| 国产精品日韩久久久| 欧美日韩精品免费观看视完整| 国产亚洲一区| 亚洲18在线| 免播放器亚洲| 红桃视频国产一区| 蜜桃成人av| 久久精品国产99久久| 97精品97| 国产精品欧美三级在线观看 | 日韩午夜高潮| 国产成人免费精品| 久久国产尿小便嘘嘘| 国产精品亚洲综合色区韩国| 日韩一区二区三区免费视频| 亚洲精品国产精品粉嫩| 欧美日韩国产免费观看视频| 蜜桃av在线播放| 国产盗摄——sm在线视频|