寫網頁程式常常會碰到一些資安的問題,畢竟網頁是最容易遭受攻擊的服務之一
程式的素質往往也參差不齊,所以趁最近剛好有整理就記錄一下
==============XSS(跨網站指令碼)================
XSS主要是出現在一些輸入的資料,最終會在輸出在網頁上的情況下(留言板,布告欄,部落格等)
使用者輸入的內容因為會被輸出來,所以當內容中有可執行的程式碼(javascript)
就可以讓使用者去執行,常見的破壞方式有
1.導向其他帳號密碼登入的網頁騙取帳號密碼
2.javascript可以做的事情幾乎都有可能被插入(DDoS,alert)
防範方式很簡單,只要破壞程式碼的結構即可
PHP的話就是使用htmlspecialchars,perl則是使用encode_entities
將一些特殊字元做轉換
例如 就會轉換成 <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就可以改成以下程式碼
基本上就可以完全阻絕被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網頁進行比對
程式的素質往往也參差不齊,所以趁最近剛好有整理就記錄一下
==============XSS(跨網站指令碼)================
XSS主要是出現在一些輸入的資料,最終會在輸出在網頁上的情況下(留言板,布告欄,部落格等)
使用者輸入的內容因為會被輸出來,所以當內容中有可執行的程式碼(javascript)
就可以讓使用者去執行,常見的破壞方式有
1.導向其他帳號密碼登入的網頁騙取帳號密碼
2.javascript可以做的事情幾乎都有可能被插入(DDoS,alert)
防範方式很簡單,只要破壞程式碼的結構即可
PHP的話就是使用htmlspecialchars,perl則是使用encode_entities
將一些特殊字元做轉換
" "
' '
< <
> >
& &
例如 就會轉換成 <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網頁進行比對