sql注入一点小心得
生活随笔
收集整理的這篇文章主要介紹了
sql注入一点小心得
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
好久沒寫技術(shù)博客,最近研究產(chǎn)品關(guān)于用戶體驗(yàn)方面較多,加上項(xiàng)目突然比較多,設(shè)計(jì)原型、跟進(jìn)開發(fā)、設(shè)計(jì)師等工作著實(shí)沒時(shí)間寫博客。 接下來技術(shù)上主要php深入學(xué)習(xí)和mysql優(yōu)化。這兩天看了關(guān)于sql注入方面的知識,拿出來分享一下 :) 登錄注入
先看一個(gè)我們一般用的登錄頁面sql語句(原生態(tài)php執(zhí)行的sql) $sql = "select * from users where username = '$username' and password = '$password'";
這個(gè)比較好理解,一般在頁面的搜索框點(diǎn)擊按鈕搜索時(shí)在后臺sql中可能會用like來查詢,但如果沒有加任何處理,可能輸入一個(gè)% 或 __ 就會注入到sql中查詢?nèi)炕虿糠钟涗?#xff0c;不過在php中可以使用一個(gè)函數(shù)來處理一下: $keyword = addslashes($keyword); $keword = str_replace("%","\$",$kwyword);
插入注入
我們先模擬一個(gè)網(wǎng)站注冊頁面的sql處理語句: insert into users(username,password,grade) values('frank','123456','1'); 假如users表中g(shù)rade為等級字段,并且默認(rèn)字段為1,注冊時(shí)用戶輸入用戶名和密碼兩個(gè)字段后,后臺插入語句為上面語句,則當(dāng)用戶輸入的密碼為 123456','3')/*時(shí),執(zhí)行sql為: insert into users(username,password,grade) values('frank','123456','3')/*,'1'; 這樣也可以達(dá)到注入的目的 解決sql注入:?
? ? ? ①. 在服務(wù)器設(shè)置將php.ini配置文件中magic_quotes_gpc設(shè)置為On 服務(wù)器會自動(dòng)將單引號轉(zhuǎn)義為:\' 不過攻擊時(shí)可以將單引號寫為char(13)-單引號ASCII碼,也一樣可以攻擊 ?②. 密碼比對 通過輸入的用戶名獲取密碼,再對密碼進(jìn)行匹配 $sql ?= "select * from users where username ='frank'" $result = mysql_query($sql,$conn); $row = mysql_fetch_array($result); if($row['password'] != $password) ... ③. 使用pdo的PDO::prepare()預(yù)處理操作 PDO(PHP Data Object)擴(kuò)展在PHP5中加入,PHP6默認(rèn)識別PDO連接數(shù)據(jù)庫,pdo相當(dāng)于是一個(gè)數(shù)據(jù)庫抽象層,不同數(shù)據(jù)庫使用相同的方法名,解決數(shù)據(jù)庫連接不同意問題。 工作原理如下: (使用時(shí)需先在php.ini中開啟對pdo擴(kuò)展的支持) $sql = "select * from users where username=? and password=?";//創(chuàng)建一個(gè)pdo對象$mypdo = new PDO("mysql:host=localhost;port=3306;dbname=xx","root","123456");//設(shè)置編碼$mypdo->exec("set names utf8");//預(yù)處理$sql$pdostatement = $mypdo->prepare(%sql);//將用戶名和密碼填入sql$pdostatement->execute(array($username,$password));//得到查詢結(jié)果$result = $pdostatement->fetch();if(empty($result)) ...
先看一個(gè)我們一般用的登錄頁面sql語句(原生態(tài)php執(zhí)行的sql) $sql = "select * from users where username = '$username' and password = '$password'";
對于這種sql,對應(yīng)一個(gè)萬能密碼和用戶名:
萬能密碼: xx' or 1='1 萬能用戶名: xx' union select * from users/* 執(zhí)行時(shí)mysql解釋為: $sql = select * from users where username = '$username' and password = ' xx' or 1='1'不解釋,瞬間破解
同樣,上面是在sql語句中查詢字段后的輸入值加了單引號,有些時(shí)候尤其是初級程序員經(jīng)常對變量不加單引號:
?
$sql = "select * from users where username = $username and password = $password";?
這時(shí)mysql解釋會被當(dāng)做數(shù)字型字段來匹配
萬能密碼: 11 union select * from users/* ?執(zhí)行語句: select * from users where username = 11 union select * from users/* and password = 54 查詢注入這個(gè)比較好理解,一般在頁面的搜索框點(diǎn)擊按鈕搜索時(shí)在后臺sql中可能會用like來查詢,但如果沒有加任何處理,可能輸入一個(gè)% 或 __ 就會注入到sql中查詢?nèi)炕虿糠钟涗?#xff0c;不過在php中可以使用一個(gè)函數(shù)來處理一下: $keyword = addslashes($keyword); $keword = str_replace("%","\$",$kwyword);
插入注入
我們先模擬一個(gè)網(wǎng)站注冊頁面的sql處理語句: insert into users(username,password,grade) values('frank','123456','1'); 假如users表中g(shù)rade為等級字段,并且默認(rèn)字段為1,注冊時(shí)用戶輸入用戶名和密碼兩個(gè)字段后,后臺插入語句為上面語句,則當(dāng)用戶輸入的密碼為 123456','3')/*時(shí),執(zhí)行sql為: insert into users(username,password,grade) values('frank','123456','3')/*,'1'; 這樣也可以達(dá)到注入的目的 解決sql注入:?
? ? ? ①. 在服務(wù)器設(shè)置將php.ini配置文件中magic_quotes_gpc設(shè)置為On 服務(wù)器會自動(dòng)將單引號轉(zhuǎn)義為:\' 不過攻擊時(shí)可以將單引號寫為char(13)-單引號ASCII碼,也一樣可以攻擊 ?②. 密碼比對 通過輸入的用戶名獲取密碼,再對密碼進(jìn)行匹配 $sql ?= "select * from users where username ='frank'" $result = mysql_query($sql,$conn); $row = mysql_fetch_array($result); if($row['password'] != $password) ... ③. 使用pdo的PDO::prepare()預(yù)處理操作 PDO(PHP Data Object)擴(kuò)展在PHP5中加入,PHP6默認(rèn)識別PDO連接數(shù)據(jù)庫,pdo相當(dāng)于是一個(gè)數(shù)據(jù)庫抽象層,不同數(shù)據(jù)庫使用相同的方法名,解決數(shù)據(jù)庫連接不同意問題。 工作原理如下: (使用時(shí)需先在php.ini中開啟對pdo擴(kuò)展的支持) $sql = "select * from users where username=? and password=?";//創(chuàng)建一個(gè)pdo對象$mypdo = new PDO("mysql:host=localhost;port=3306;dbname=xx","root","123456");//設(shè)置編碼$mypdo->exec("set names utf8");//預(yù)處理$sql$pdostatement = $mypdo->prepare(%sql);//將用戶名和密碼填入sql$pdostatement->execute(array($username,$password));//得到查詢結(jié)果$result = $pdostatement->fetch();if(empty($result)) ...
?
? ? ?④. 其他企業(yè)級解決sql注入方式:IDS(入侵檢測系統(tǒng)) 關(guān)于sql注入對于開發(fā)工程師來說主要是防守,提高編寫安全代碼的意識,讓我們編寫的代碼質(zhì)量更高,安全性方面更好。轉(zhuǎn)載于:https://www.cnblogs.com/fanchangfa/p/3415944.html
總結(jié)
以上是生活随笔為你收集整理的sql注入一点小心得的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 运用代码管理段来提升开发效率
- 下一篇: Codeforces Round #21