2014年5月29日 星期四

preg_match 用法

資料來源:http://sfs.chc.edu.tw/~chi/blog/index.php?load=read&id=229

preg_match(規則, 欲比對字串, 回傳結果);
如果我們是這樣用
$CH=preg_match(規則, 欲比對字串, $ABC);
$CH還是真假值,而$ABC則為符合的結果陣列
preg_match("/^(http:\/\/)?([^\/]+)/i",
"http://www.php.net/index.html", $matches);
print_r($matches);


結果:
Array
(
    [0] => http://www.php.net
    [1] => http://
    [2] => www.php.net
)

如何產生DLL檔部暑網站


Precompiled Web Site 是指編譯過的網站,在 .NET 1.x 是由 Visual Studio 處理, .NET 2.0 多了一個新的 aspnet_compiler.exe 工具程式(含在 .NET Framework 中),讓開發人員可以在沒有 Visual Studio 環境下,可以對它進行編譯,和 Visual Studio 的 Publish Web Site 是一樣的,只是要手動處理所有事情 .

-----------
下列命令會就地編譯 WebApplication1 應用程式:
Aspnet_compiler -v /WebApplication1
下列命令會就地編譯 WebApplication1 應用程式。已編譯的應用程式也會包含偵錯資訊,如果其中報告發生錯誤,則工具會加入堆疊追蹤資訊。
Aspnet_compiler -v /WebApplication1 -d -errorstack
下列命令會使用實體目錄路徑,編譯供部署使用的 WebApplication1 應用程式,也會在輸出組件中加入兩個屬性。它會使用 -keyfile 選項加入AssemblyKeyFileAttribute 屬性,以指定 Key.sn 檔包含公開/私密金鑰組資訊,而工具可以將該資訊用於所產生組件的強式名稱。此命令也會使用 -aptca 選項,在產生的組件中加入 AllowPartiallyTrustedCallersAttribute 屬性。編譯的 Web 應用程式是建立於 c:\applicationTarget 目錄中。
Aspnet_compiler -v /WebApplication1 -p c:\Documents and Settings\Default\My Documents\MyWebApplications\WebApplication1 -keyfile c:\Documents and Settings\Default\My Documents\Key.sn -aptca c:\applicationTarget
下列命令會編譯預設 Metabase 路徑下的 WebService2 服務,以編譯的應用程式覆寫 SampleWebService 目標目錄。
Aspnet_compiler -m LM/W3SVC/1/ROOT/WebService2 -f c:\InetPub\wwwroot\SampleWebService

2014年5月27日 星期二

PHP 使用MD5加密


http://www.hkcode.com/programming/242
http://www.php5.idv.tw/modules.php?mod=forum&act=show&cid=13&showid=1931

新增資料

CODE:
<?php
$db_conn = mysql_connect("host", "db_user", "db_pass");
mysql_select_db("db_name", $db_conn);

// 插入資料表的 $password 用了 md5 加密
mysql_query("insert into users values
                        ('$username', '".md5($password)."')");
?>




 查詢帳號


CODE:
<?php
$db_conn = mysql_connect("host", "db_user", "db_pass");
mysql_select_db("db_name", $db_conn);

$sql = mysql_query("select * from users where
                        `username`='$username' and
                        `password`='".md5($password)."'");

if (mysql_num_rows($sql) > 0) {
    // 用戶名稱及密碼正確
} else {
    // 用戶名稱及密碼錯誤
    exit();
}
?>

PHP正則表達式-使用preg_match()過濾字串

資料來源
http://newaurora.pixnet.net/blog/post/171424314-php%E6%AD%A3%E5%89%87%E8%A1%A8%E9%81%94%E5%BC%8F-%E4%BD%BF%E7%94%A8preg_match()%E9%81%8E%E6%BF%BE%E5%AD%97%E4%B8%B2

在網頁程式撰寫的時候,經常需要把使用者輸入的字串做過濾
但有些時候並非惡意攻擊字串
可能使用者只是輸入錯誤
因此我們需要做一些基本的檢查來預防和提式
下面是使用 preg_match() 這個函數來檢查字串的方式

    首先先簡單介紹一下 preg_match() 這個函數的用法
    preg_match( 正則表達式 , 要比對的字串 , 比對結果)
    其中比對結果是一個陣列,其中陣列結果是 $result[0]=原字串、$result[1]=第一個符合規則的字串、$result[2]=第二個符合規則的字串...以此類推
    比對結果則回傳 1(正確) 或是 0(錯誤)
    下面是一個簡單的範例

        if(preg_match($regex, $resource , $result)) {
            echo "OK";
        } else {
            echo "error";
        }

       另外附上幾個常用的表達式

       //A. 檢查是不是數字
       $standard_A = "/^([0-9]+)$/"; 
       //B. 檢查是不是小寫英文
       $standard_B = "/^([a-z]+)$/";
       //C. 檢查是不是大寫英文
       $standard_C = "/^([A-Z]+)$/";
       //D. 檢查是不是全為英文字串
       $standard_D = "/^([A-Za-z]+)$/"; 
       //E. 檢查是不是英數混和字串
       $standard_E = "/^([0-9A-Za-z]+)$/";
       //F. 檢查是不是中文
       $standard_F = "/^([\x7f-\xff]+)$/"; 
       //G. 檢查是不是電子信箱格式
       //$standard_G_1 這組正則允許 "stanley.543-ok@myweb.com" 
       //但 $standard_G_2 僅允許 "stanley543ok@myweb.com" ,字串內不包含 .(點)和 -(中線) 
       $standard_G_1 = "/^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/";
       $standard_G_2 = "/^[\w]*@[\w-]+(\.[\w-]+)+$/" ;
       //下面則是個簡單的範例,大家可以嘗試看看

       $string = "stanley.543-ok@myweb.com" ;
       $standard_G_1 = "/^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/";
       $standard_G_2 = "/^[\w]*@[\w-]+(\.[\w-]+)+$/" ;
       function checkString($strings, $standard){
           if(preg_match($standard, $strings, $hereArray)) {
              return 1;
           } else {
              return 0;
           }
       }

       echo checkString($string, $standard_G_1);
       echo "
";
       echo checkString($string, $standard_G_2);


如果覺得對你有幫助的話. 麻煩幫小弟按個讚哦~

其他相關文章參考:


在 php.ini 中設定 magic_quotes_gpc = Off / On
是指 所有 GET、POST 和 COOKIE 的資料 都自動以 addslashes() 處理過

http://mini.nidbox.com/diary/read/7698772


SQL injection 解決方法

資料來源:http://newaurora.pixnet.net/blog/post/166231341-sql-injection-%E7%AF%84%E4%BE%8B(%E7%99%BB%E5%85%A5%E7%AF%84%E4%BE%8B)


SQL injection 基本介紹

SQL injection(又稱SQL注入式攻擊 或是 SQL資料隱碼攻擊),指的是利用SQL指令的輸入字串中夾帶其他的SQL指令,一般來說都是從正當的查詢指令中夾帶惡意指令
例如:非法取得資料、惡意破壞資料...等。因此在程式設計時,也必須把這個基本的安全性給考慮進去。
下面就介紹一個基本的SQL injection範例(以帳號登入為例)
首先,我們先建立一個HTML表單來傳送資料

帳號:
密碼:
同時也建立一個資料庫來做測試
sql  

接著就可以撰寫接收端程式
 //接收帳號、密碼
 $account = $_REQUEST['account'];
 $pass = $_REQUEST['password'];
 //密碼使用md5加密
 $password = md5($pass);
 //查詢有無符合帳號資料
  $sql = "SELECT * FROM `test_sql` WHERE `account` LIKE '".$account."' AND `password` LIKE '".$password."'";
  $res = mysql_query($sql);
  $result = mysql_fetch_array($res);
  if(empty($result)){
     //若無符合顯示查無帳號
     echo "查無此帳號
";
     echo $sql;
     echo "
輸入帳號".$account;
     echo "
輸入密碼".$pass;

  }else{
     //若符合顯示帳號、密碼資訊
     echo "帳號:".$account;
     echo "
密碼:".$pass;
     echo "
".$sql;

  }
以此例說明:
當帳號輸入"' OR ''=''#" 或是 "' OR ''=''-- "(雙引號內字串)就可以進行非法登入(如下圖)
input1或是   input2   

原理:在SQL指令中 "#"和"-- "代表注釋
因此原本輸入的查詢是
"SELECT * FROM `test_sql` WHERE `account` LIKE '".$account."' AND `password` LIKE '".$password."'";
會變成account欄位等於空 或是 ''='' ,後面的密碼則被注釋掉了
"SELECT * FROM `test_sql` WHERE `account` LIKE '".$account."'' OR ''=''";
而後者條件成立,SQL指令就會開始執行(如下圖,此例取出第一筆資料)
output1  

解決這類型的非法登入的方式有幾種:
1. 使用正則表達式過濾字串;這是最搞剛卻也最安全的作法
2. 使用addslashes();這個函數會在所有的單引號前加上反斜線
下面就用addslashes()來簡單說明
//在接收的參數錢加上addslashes()
$account = addslashes($_REQUEST['account']);
$pass = addslashes($_REQUEST['password']);
再測試非法登入
output2  

輸入的資料經過轉換後,單引號的作用就失效了
這樣就能有效防範非法登入,而且對於一般人使用正當登入方法不受影響

如果覺得對你有幫助的話. 請幫小弟按個讚吧~

My SQL相關文章:


2014年5月26日 星期一

PHP架站


http://shaurong.blogspot.tw/2013/10/apache-php-mysql-on-win7.html

安裝環境:Windows 7 with SP1 x64

****************************************

安裝需要下面 5 個軟體:

Microsoft Visual C++ 2010 SP1 Redistributable Package (x64)
Microsoft Visual C++ 2010 SP1 可轉發套件 (x64)
(也就是 Visual C++ Redistributable Package v10.0.40219.1)
http://www.microsoft.com/download/en/details.aspx?id=13523
(httpd-2.4.6-win64.zip 中程式執行需要)

Microsoft Visual C++ Redistributable for Visual Studio 2012 Update 3 (x64)
Microsoft Visual C++ 2012 Update 3 可轉發套件 (x64)
(也就是 Visual C++ Redistributable Package v11.0.60610.1)
http://www.microsoft.com/download/en/details.aspx?id=13523
(php-5.5.4-Win32-VC11-x64.zip 中程式執行需要)

注意,上面兩個下載回來的都是 vcredist_x64.exe,但是為不同的檔案,兩個都需要安裝。

Web Server : httpd-2.4.6-win64.zip
PHP        : php-5.5.4-Win32-VC11-x64.zip
MySQL      : mysql-5.6.13-winx64.zip

****************************************

參考資料:

Apache Web Server (Httpd) 2.4 在 MS-Windows 上安裝說明
http://httpd.apache.org/docs/2.4/platform/windows.html

PHP 在 Windows 安裝程序(PHP 5.2 及更新版本)
http://in2.php.net/manual/zh/install.windows.installer.msi.php

Installing MySQL 5.6 on Microsoft Windows
http://dev.mysql.com/doc/refman/5.6/en/windows-installation.html
http://dev.mysql.com/doc/refman/5.6/en/windows-start-service.html
http://dev.mysql.com/doc/refman/5.6/en/server-configuration-defaults.html

****************************************


SQL 資料庫加密


http://blog.xuite.net/tolarku/blog/30804854-SQL%20%E8%B3%87%E6%96%99%E5%BA%AB%E5%8A%A0%E5%AF%86

PHP 加密在資料庫的密碼
http://www.hkcode.com/programming/242

關於SQL INJECTION(SQL 植入) 安全問題
http://twpug.net/discussion/7119

http://stackoverflow.com/questions/517008/how-to-turn-off-magic-quotes-on-shared-hosting
查詢
資料庫 密碼 加密 SQL Injection



2014年5月23日 星期五

adsense.txt

"確認本人對本網域的擁有權,同時確認本網站遵守 Google AdSense 計劃政策和條款。 ca-pub-4168274599671219 "

2014年5月22日 星期四

google 廣告


google賺錢排行榜
http://blog.17rich.com/google-adsense-top-earner.html


使用youtube賺錢
http://blog.yam.com/ckboy/article/55260828
https://www.facebook.com/notes/youtube%E8%B6%85%E8%AE%9A%E7%B2%89%E7%B5%B2%E5%9C%98/%E6%95%99%E4%BD%A0%E5%80%91%E5%A6%82%E4%BD%95%E9%80%8F%E9%81%8Eyoutube%E5%BD%B1%E7%89%87%E4%BE%86%E8%B3%BA%E9%8C%A2/374321439314436

google賺錢分享文 - 我的人生第一張Google Adsense支票
http://www.advertisingfan.net/2012/01/my-first-google-adsense-check.html

http://blog.xuite.net/jin117/blog/14858976-%E5%9C%A8blog%E5%88%8A%E5%BB%A3%E5%91%8A%E7%82%BA%E6%82%A8%E5%B8%B6%E4%BE%86%E6%94%B6%E7%9B%8A-Google%20AdSense%E7%B6%93%E9%A9%97%E5%88%86%E4%BA%AB

https://www.youtube.com/watch?v=7J5yZuN3aYM

http://blog.xuite.net/jin117/blog/14858976-%E5%9C%A8blog%E5%88%8A%E5%BB%A3%E5%91%8A%E7%82%BA%E6%82%A8%E5%B8%B6%E4%BE%86%E6%94%B6%E7%9B%8A-Google+AdSense%E7%B6%93%E9%A9%97%E5%88%86%E4%BA%AB

-----------------------------
作者:阿呆與阿敏

看到很多人在問如何在自己的部落格内置入 Google adsense 廣告程式。粘貼 Google adsense 廣告非常簡單,網路上有很多 
高手發了好多經驗文章,我搜集了一些,供大家借鑑: 
1. Google adsense代碼實施指南  (http://big5.chinaz.com:88/
cntoppick.my.chinaz.com/63111.shtml ) 
2. 如何在部落格的文章中間顯示廣告
(http://fairyfish.net/2007/07/23/how-to-show-ads-between-posts-on-your-
blog/) 
3. 我要如何將 AdSense 放到我的 blog 中?
http://help.blogger.com/bin/answer.py?answer=42281&hl=zh_TW  ) 
4. 如何將 AdSense 放到您的 blog 的提要欄位
http://help.blogger.com/bin/answer.py?answer=42291&ctx=sibling  ) 
5.  如何於無名部落格內文區置放 Adsense
http://www.wretch.cc/blog/CGS&article_id=12212034  ) 
6. [教學] 如何將 Google Adsense 置入無名
http://www.wretch.cc/blog/rodvader&article_id=10132499  ) 
7. 如何將 Google AdSense 置入 Pixnet 部落格
http://adsense-tw.com/archives/157  ) 
8. 如何在 SinaBlog 內文加入AdSense
http://enochng.mysinablog.com/index.php?op=ViewArticle&articleId=818951
9. 如何在 blogspot 文章中間加入 Google AdSense 
http://01mistery.blogspot.com/2007/08/google-adsense.html  )

2014年5月19日 星期一

家用電器輻射排行榜


日本有一本書叫做"買不得" 非常暢銷賣了100萬本以上 裡面提到有關電動刮鬍刀的內容

在電磁性生體學部門,曾經兩次獲得諾貝爾獎提名的美國紐約州立大學醫學部教授貝克在《CrossCurrent──電磁波「重複輻射」的恐怖》一書中,指出我們日常生活所使用的家電製品,發出的電磁波安全值是1mG。14吋大的電視,距離1公尺所發出的電磁波剛好是1mG。

使用交流式馬達的、接插座的電動刮鬍刀,在距離3公分的位置,電池波高達15,000mG,是貝克博士安全值的15000倍,電池式刮鬍刀依照產品不同,電磁波或有強弱,但都會發出電磁波。眾所周知,電磁波會加速癌細胞的增值能力,變化為惡性腫瘤。

貝克博士擔憂的是,如果臉上有痣的人,使用電動刮鬍刀,強力電磁波,可能會引發病變,得皮膚癌。雖然每天使用時間短,但輻射量會日積月累,例如癌症、白血病、腦瘤等電磁波可能導致疾病,都要等到10年以後才會出現。要避免每天一點一點所接收的輻射,最好儘快改用一般的刮鬍刀,在臉上抹上肥皂,安心地慢慢享受刮鬍子的樂趣。


---------------

資料來源 http://www.life.com.tw/?app=view&no=127543


測試儀器


電磁輻射測試儀,計量單位:μt(微特斯拉)

第13名:液晶電視輻射指數★☆

距離液晶電視屏幕20厘米遠時,輻射值為零,距離10厘米遠的時候輻射值為0.03μt,貼近屏幕則會達到16.04μt。建議小伙伴們看電視時,至少要保持一米以上的距離,這個距離幾乎不會受到電視輻射的影響,相對比較安全。

第12名:冰箱輻射指數★☆

貼近冰箱的正門輻射值為0.05μt,稍微遠離輻射值就顯示為零;另外,冰箱的側面 ​​以及背部輻射情況基本相同,貼近側面輻射值為0.79μt,貼近背部僅為0.16μt,所以大家完全沒必要過度在意冰箱的輻射哦~

第11名:加濕器輻射指數★☆



距離加濕器 10厘米處輻射值為零,貼近加濕器則會達到5.35μt,超出了0.2μt的安全標準。建議在使用加濕器的時候,至少要保證10厘米以外的安全距離,不要讓加濕器貼近身邊,這樣才能防止輻射的危害。

第10名:飲水機輻射指數★★☆



在飲水機保溫或者加熱的過程中,飲水機的輻射從零上升至0.03μt,輻射完全在安全範圍內。

第9名:筆記本電腦輻射指數★★☆



距離筆記本電腦 30厘米處,輻射值顯示為零,慢慢靠近筆記本,20厘米處輻射值顯示依然為零,當貼近筆記本邊緣的時候,輻射顯示為1.6μt,輻射量符合安全標準。

使用筆記本的時候保持20厘米以上的距離,就不會有輻射的危害。

第8名:台式電腦輻射指數★★★☆

測試液晶顯示屏,在距離屏幕10厘米處輻射值為零,貼近屏幕為0.23μt,基本符合安全標準,所以液晶屏幕的輻射可以忽略不計。

在距離機箱20厘米處輻射值為零,不過貼近機箱輻射值大於10.03μt,遠遠高出了輻射標準,所以在日常使用時,至少要離機箱20厘米,才能保證安全。

第7名:微波爐輻射指數★★★☆


微波爐在運行時,距離正門0到65厘米處的輻射數值急劇減小,距離正門70厘米處輻射值已經為零,所以建議在使用微波爐的時候,盡量站在微波爐一米之外,這樣就可以有效的避免微波輻射所帶來的危害。

第6名:電磁爐輻射指數★★★★☆



電磁爐在運作的時候距離40厘米以內都超出了安全輻射標準(0.2μt,越高輻射越大),其中10厘米處為19.74μt,但是隨著距離的拉遠,電磁輻射迅速衰減,在40厘米處已經符合安全標準,所以建議在使用電磁爐的時候,一定要保持半米的距離,這樣就能保證使用者不受電磁輻射的傷害。

第5名:手機輻射指數★★★★☆


手機在待機情況下,手機的輻射值基本為0,在呼叫的過程中,手機輻射瞬間達到約3μt,遠遠大於0.2μt的安全值,由於一般接聽電話手機近距離貼到頭部,長時間通話影響更大,建議用戶使用耳機接聽。

第4名:電熱毯輻射指數★★★★☆


電熱毯打開的時候輻射值為16.69μt,運行的時候也會產生很大的輻射,所以建議用戶在使用電熱毯的時候盡量提前打開預熱,等睡覺的時候最好關閉電熱毯,這樣才能避免它的高輻射。

第3名:甩脂機輻射指數★★★★★


甩脂機的輻射達到18.29μt,由於甩脂機是貼身使用,而且使用時間一般都是10-20分鐘,輻射影響也是非常大的。

第2名: 電吹風輻射指數★★★★★


在距離電吹風風口5厘米的地方,輻射值15.48μt。靠近電吹風的機身部分,輻射值達到18.49μt,長期使用電吹風的話,也會給使用者帶來一定的輻射傷害。

第1名:電動刮鬍刀輻射指數★★★★★


刮鬍刀打開時輻射值瞬間達到19.59μt,輻射值遠超微波爐、電磁爐等電器,所以各位男士朋友一定要盡量減少刮鬍刀的使用哦~

Gridview刪除時做確認

<asp:TemplateField ShowHeader="False"> <ItemTemplate> <asp:LinkButton ID="LinkButton1" runat="server" CausesValidation="False" CssClass="btnlink" CommandName="Delete" Text="刪除" OnClientClick="return confirm('是否刪除?');" ></asp:LinkButton> </ItemTemplate> </asp:TemplateField>

2014年5月16日 星期五

SQL injection

http://en.wikipedia.org/wiki/SQL_injection

資料來源:
http://ithelp.ithome.com.tw/question/10080209

解決方法:使用 SqlCommand.Parameters 屬性
http://msdn.microsoft.com/zh-tw/library/system.data.sqlclient.sqlcommand.parameters.aspx

回到之前重構系列的第一篇文章:[如何提升系統品質-Day2]重構– UI, Business logic, Data access概念分開,以這篇文章的例子來說明,不好的設計,SQL injection會怎麼發生。

畫面


需求
當輸入的帳號密碼,在資料庫中有吻合的資料,代表帳號密碼是對的。(再強調一次,一般設計驗證密碼的部分,應該是透過畫面上輸入密碼的值進行hash,再與資料庫中該帳號所對應hash完的密碼比對,以保障密碼不是以明文存在於資料庫中,確保密碼無法被還原)

直覺設計且造成SQL injection問題的程式碼
  1. protected void Verify_Click(object sender, EventArgs e)  
  2. {  
  3.     string connectionString = @"myConnectionString";  
  4.     int count;  
  5.     using (SqlConnection cn = new SqlConnection(connectionString))  
  6.     {  
  7.         cn.Open();  
  8.         string sqlStatement = @"Select Count(1) From SomeTable Where ID= '" + this.Id.Text + "' AND Password= '" + this.Password.Text + "'";  
  9.         SqlCommand sqlCommand = new SqlCommand(sqlStatement, cn);  
  10.         count = (int)sqlCommand.ExecuteScalar();  
  11.     }  
  12.   
  13.     this.Result.Text = (count > 0) ? "Pass" : "帳號或密碼錯誤";  
  14. }  


這樣的程式碼會有什麼問題? 問題可大了! 假設我是壞人,知道或猜測這功能的SQL是這樣串的(大部分功能都很好猜的,猜錯了也不會被咬),那麼我只要在畫面上的Id,隨便輸入個值,接著在密碼的部分,輸入' OR 1=1; --

這時候,這一支聰明的功能就可以把完整的SQL statement組出來,變成Select Count(1) From SomeTable Where ID= '隨便輸入' AND Password ='' OR 1=1; -- 

輸入這樣的值代表什麼,代表所有畫面上的輸入值都無所謂,因為1=1恆等式一定會成立,且前面的condition為OR,所以可以把前面的where condition都忽略掉。後面再補上個分號,代表這一個SQL子句已經結束,最後再補上--,代表後面的sql為註解。

就這樣,最基本的SQL injection就成功了。是的,這個網站在裸奔了。

如果你以為,只有登入頁面會存在這樣的問題,或是這樣的問題影響不大,那就大錯特錯了。通常會寫出這樣程式的人,如果又都是自己設計,那洞就不只一個。首先,DB的存取帳號,可能就是預設的sa或admin,也就是權限開到最大。這時候的SQL injection要進DB做事,就跟進自己家廚房一樣,例如:
Select Count(1) From SomeTable Where ID= '隨便輸入' AND Password ='' OR 1=1; DROP DATABASE pubs -- 
恭喜你,你DB中的pubs這個DataBase就被Drop掉了。

駭客高興的話,也可以針對sysobjects跟syscolumns來瞭解你DB中有哪些table, 欄位,再比對一下網頁的資料,接著透過Update的語法,把相關的欄位資料加入一些html tag或惡意的程式碼,進而引發從SQL injection觸發的Cross-site Scripting(XSS攻擊),常見的結果就是連到那一頁時,可能被導到別頁,或是XX政府網站上被掛上特殊的國旗,再來就是莫名其妙的個資外洩。

這些情況充斥在我們的生活中,這一切的原罪,都是因為程式設計師的偷懶或不專業。

除了上述的例子,還可以怎麼瞭解SQL的組成?以ASP.NET來說,一樣,通常會寫出那樣有問題的程式,web.config可能也沒有設定custom error頁面,所以當程式出錯時,IIS就大剌剌的幫你把程式錯誤的資訊show在網頁上(就是黃頁的那個),要讓錯誤資訊是掛在SQL statement執行錯誤,是一件再簡單不過的事。所以,要瞭解該網頁的輸入和對應SQL的組成,根本不需要駭客等級就可以做。瞭解之後,要啟動SQL injection,也就只是易如反掌的事。

如何避免SQL injection
簡單的說,過濾輸入值。

但,攻擊手法相當多種,要過濾的字元組合可能一個都漏不得,所以自己設定黑名單來進行過濾,是一件非不得以才做的事。如果是用ASP.NET寫,那所有人的強烈建議,就是使用Parameters

Parameter的用法相當簡單,這也是為什麼我前面會說,寫出SQL injection問題的程式碼,是一種偷懶的行為。
  1. protected void Verify_Click(object sender, EventArgs e)  
  2. {  
  3.     string connectionString = @"myConnectionString";  
  4.     var id = this.Id.Text;  
  5.     var password = this.Password.Text;  
  6.   
  7.     int count;  
  8.     using (SqlConnection cn = new SqlConnection(connectionString))  
  9.     {  
  10.         cn.Open();  
  11.         string sqlStatement = @"Select Count(1) From SomeTable Where ID= @id AND Password= @password";  
  12.         SqlCommand sqlCommand = new SqlCommand(sqlStatement, cn);  
  13.           
  14.         ////定義parameter型別  
  15.         sqlCommand.Parameters.Add("@id", SqlDbType.VarBinary);  
  16.         sqlCommand.Parameters["@id"].Value = id;  
  17.           
  18.         ////讓ADO.NET自行判斷型別轉換  
  19.         sqlCommand.Parameters.AddWithValue("@password", password);  
  20.   
  21.         count = (int)sqlCommand.ExecuteScalar();  
  22.     }  
  23.   
  24.     this.Result.Text = (count > 0) ? "Pass" : "帳號或密碼錯誤";  
  25. }  


透過使用parameter,在SqlCommand執行時,會自動過濾掉可能造成問題的字元,並拋出對應的。

另外,SQL injection並不只會發生在where condition,也有可能發生在Order by等語法中。所以只要是畫面上可能被改變的值,要串到SQL語法中,就應該使用parameter。

結論
在patterns & practices Developer Center簡單歸納出三個步驟防止SQL injection:
Step 1. Constrain input.
Step 2. Use parameters with stored procedures.
Step 3. Use parameters with dynamic SQL.

另外的補充:
1.web.config的custom error要記得打開,避免讓『使用者』看到詳細的錯誤訊息
2.權限這種東西,都是能開越小越好,包括資料庫。
3.所謂畫面可能被改變的值,可能包括了Url上的QueryString,post過來的表單資料,甚至於cookie內容假造。

----------------------------------------------------------------------------------------

sql = select * from table where user = @user
Command.Parameters.Add("@user",SqlDbType.nvarchar,100).Value = user.Text


'**** 重 點!*************************************************
'**** DataReader 改用 SqlCommand的 @參數來作
Dim cmd As New SqlCommand("select * from test where id = @id", Conn)

cmd.Parameters.Add("@id", SqlDbType.Int)
cmd.Parameters("@id").Value = CType(Request("id"), Integer)

'== 參考網址  http://msdn.microsoft.com/zh-tw/library/system.data.sqlclient.sqlcommand.parameters.aspx
'************************************************************
整理

SQL Injection (資料隱碼)– 駭客的 SQL填空遊戲(上)
http://www.microsoft.com/taiwan/sql/sql_injection_g1.htm
SQL Injection (資料隱碼)– 駭客的 SQL填空遊戲(下)
http://www.microsoft.com/taiwan/sql/SQL_Injection_G2.htm
此外有些部落客在過去也都寫過很多好文,也可以參考參考
像是黑暗大寫過的
游擊式的SQL Injection攻擊
blog.darkthread.net/post-2008-05-22-hit-and-run-sql-injection-attack.aspx
或是91大寫過的