HOME | 其他語言 | sql injection、XSS與網頁安全防護

sql injection、XSS與網頁安全防護

2016/03/07/10:59 , Post in 其他語言 , 評論(0) , 引用(0) , 閱讀(1845) , Via 本站原創
寫網頁程式常常會碰到一些資安的問題,畢竟網頁是最容易遭受攻擊的服務之一

程式的素質往往也參差不齊,所以趁最近剛好有整理就記錄一下

==============XSS(跨網站指令碼)================

XSS主要是出現在一些輸入的資料,最終會在輸出在網頁上的情況下(留言板,布告欄,部落格等)

使用者輸入的內容因為會被輸出來,所以當內容中有可執行的程式碼(javascript)

就可以讓使用者去執行,常見的破壞方式有

1.導向其他帳號密碼登入的網頁騙取帳號密碼

2.javascript可以做的事情幾乎都有可能被插入(DDoS,alert)

防範方式很簡單,只要破壞程式碼的結構即可

PHP的話就是使用htmlspecialchars,perl則是使用encode_entities

將一些特殊字元做轉換

" &quot
' '
< &lt;
> &gt;
& &amp;

例如  就會轉換成  <script></script>

瀏覽器在輸出的時候會自動轉換回去(可以看到),但是看原始碼是被轉換過的編碼(不可被執行)

==============SQL Injection(SQL資料隱碼攻擊)================

SQL Injection也是出現很久的攻擊方式了,主要是網頁程式輸入的參數夾帶一些SQL的命令

例如原本判斷帳號密碼select username from user where user = '$user' and passwd = '$passwd'

當使用者輸入正常的帳號密碼時不會有問題,但是如果出現 '  "  /*等奇怪的字元

最簡單就(passwd = ' and '1' = '1    整行sql就變成

select username from user where user = '$user' and passwd = ' ' and '1' = '1')就有可能直接跳過登入

SQL除了用一些特殊字元去破壞SQL的架構以外,還有很多很特殊的用法

例如使用union,LOAD_FILE,CHAR編碼後組成字串、url encode.....

基本上如果要過濾這些特殊字元是過濾不完的,而因為SQL injection會發生最根本的原因

其實是SQL的命令與參數值混在一起,導致輸入的值可以偽裝成SQL的一部分,所以建議使用SQL的prepare方式

將SQL的命令與參數分開,已php為例,上面select username就可以改成以下程式碼


    $db = $connect = "mysql:host=$host;dbname=$dbname;charset=utf8";
    $db = new PDO($connect, $user, $passwd);
    $sql = "select username from user where user = ? and passwd = ?";  #SQL語法
    $sth = $db->prepare($sql);
    $result = $sth->execute(array($user,$passwd));              #參數值


基本上就可以完全阻絕被SQL Injection了。

==============CSRF(跨網站指令請求)================

這個弱點如何被利用比較複雜,但是起因很簡單,就是當A網頁傳送資料到B網頁進行處理時

B網頁沒有去檢查,這些資料是不是A網頁所傳送過來的,如果是從C網頁傳送過來時

當C被使用iframe等方式插在網頁D中,使用者在登入網站A與該被駭網頁D,同時就會執行C

就有可能造成使用者不知情的情況下,去執行了C網頁的程式碼

那要如何確保資料是從A到B呢?

簡單方式就是在A網頁產生一組亂碼,存到session與form中跟著其他參數post到B

B只要比對session的值與傳送過來的值是否相等即可。

現在常見的圖形鎖也是利用相同的方式,產生一組圖與答案,存到session後到B網頁進行比對



發表評論

暱稱

網址

電郵

開啟HTML 開啟UBB 開啟表情 隱藏 記住我 [登入] [註冊]