在web開發中你不得不註意的安全驗證問題#1-SQL
前言
隨著WEB開發的發展如日中天,越來越多的程序員增加這個行列。尤其是在大型項目團隊開發的過程中。程序員們的水平參差不齊。導致各種各樣的安全驗證不嚴密導致各種問題。
正如那句話所說,水桶能裝水的多少不取決於最高的擋板,而是最低的擋板。
那今天我就給大家演示一下常見的安全問題SQL的形成原因和預防。
環境準備
我本來打算用java做實驗的,考慮到PHP的話比較快,就用PHP演示吧。以下是我連接數據庫的代碼以及數據庫的內容。
文件名稱sql.php
<?php
$conn=mysql_connect(‘localhost‘,‘root‘,‘root‘) or die("數據庫連接失敗");
mysql_query("set names gb2312");
mysql_select_db("mytest");
$id=$_GET[‘id‘];
$sql2="select * from user where id =".$id;
$result2=mysql_query($sql2);
while($alluser=mysql_fetch_array($result2))
{
echo $alluser["name"]."==>".$alluser["school"]."<br>";
}
mysql_close($conn);
?
>
這是非經常見的連接數據庫代碼,數據庫中有三個字段各自是id title content
那我們訪問我們的地址
http://127.0.0.1/safe/sql.php?id=1
從數據庫中讀取id為1的內容,並輸入到頁面。
訪問正常.那麽假設我們構造URL成這個樣子呢?
http://127.0.0.1/safe/sql.php?id=1 and 1=1 ? ? ? ? ?//這個是顯示正常的。意思是把and後的也一起查詢。1=1顯然成立
http://127.0.0.1/safe/sql.php?
id=1 and 1=2 ? ? ? ??//這個是顯示不正常的,意思是把and後的也一起查詢。1=2顯然不成立
結果例如以下圖
這樣是非常明顯有SQL註入的漏洞的。 你以為這個漏洞沒什麽影響麽?那你大錯特錯了。
略微有點數據庫的知識就能夠構造一下查詢的語句
如上可看到,我們用order這種方法的時候。能夠推測到一共同擁有多少字段,非常顯然3個是正確的。
那麽接下來能夠用union來連接查詢。前提知道管理員表名。
構造URL例如以下
http://127.0.0.1/safe/sql.php?id=1 union select 1,2,3 from admin
這可能須要一點數據庫知識,意思是連接查詢,可將顯示位輸出到當前頁面。
結果例如以下
id=1 union select username,password,3 from admin
意思不在累述。
結果例如以下
這樣你的後臺管理賬號和密碼就被顯示出來了,假設你的項目後臺被別人登陸。後果不堪設想!
PS:本文僅僅是為提高程序員的安全意識。加強安全防護。請不要用於非法用途。因為水平有限,本文僅僅做拋磚引玉,轉載請註明出處,謝謝。
那麽怎麽預防這個問題呢?這個也是非常easy的。僅僅要在GET或POST中過濾一下參數就能夠了。
用正則表達式或者其它都是能夠的。眼下的非常多框架都是已經過濾的。詳細怎麽用就交給你自己了哦。實在不會的話能夠留言。
在web開發中你不得不註意的安全驗證問題#1-SQL