一、跨網域限制
使用ajax進行http通訊時,必須處理跨網域限制,也就是限制頁面裡所請求的URL必須與頁面本身屬於相同網域,就像是JavaScript不能操作其他頁框(frame)或子視窗中其他網域之網頁的內容一樣。這是各種瀏覽器所現有的限制,實作時不需特別在意。

二、跨網站指令碼(cross-site scripting;XSS)
通常發生在表單傳送資料時,如server端的test.php程式
<?php echo($_GET['test']); ?>
這時有人不經表單而自行傳送
test.php?test=&script>alert('您好')&/script>
這樣的GET請求,JavaScript是會被執行的。

●排除外來的程式碼:
常用的方法是將HTML標籤無效化,如將<轉換成&lt;,將>轉換成&gt;
php可使用htmlspecialchars()函式轉換
$data="&script>alert(1)&/script>";
$data=htmlspecialchars($data);
echo $data;
perl可用正規表示式(regular expression)來轉換
$data=~ s/</&lt;/g;
print $data;

●JSON eval動作應小心
eval("var test=" + oj.responseText);
這段程式碼必須小心responseText的內容不能是外部傳送進來的原來樣子。

三、SQL/OS命令植入攻擊
●SQL Injection攻擊
$SQL="select * from tableA where id=".$_GET['id'].";";
像這樣對$_GET['id']原封不動放入SQL敘述裡,外部很有機會放入惡意程式碼來執行。
例如將$_GET['id']改為
;DROP TABLE tableA;
則tableA會被刪除掉
●單引號「'」插入SQL敘述攻擊
以PHP而言,可用mySQL_escape_string(),SQLite_escape_string()函式來跳脫SQL指令。
●OS命令植入攻擊(OS Command Injection)
程式中若使用system(),倒引號「`」來執行shell,可能會遭受OS Command Injection。
以PHP而言,可用escapeshellarg(),escapeshellcmd()函式避免風險。
若php.ini裡的magic_quotes_gpc設為on,則GET/POST/Cookie傳入之資料中所包含的所有單引號「'」、雙引號「"」、反斜線「\」與null字元會自動被加上反斜線跳脫。

四、密碼檔案管理
密碼不能寫在JavaScript裡。
密碼不能寫在伺服端的程式碼裡。如http sever出問題,php或perl等程式碼可能會見光死。
ajax進行http通訊時,以open方法傳入帳號、密碼。原則上這些帳號、密碼應由使用者輸入,伺服端應該這些資料加密,並妥善存放在不會被公開到web上的目錄下。

五、參考表格:
SQL Injection
mySQL/php對策:$code=mySQL_escape_string($_GET['code']);
mySQL/perl對策:$code=~s/'/"/g; $code=~s/\\/\\\\/g;
pgSQL/php對策:$code=pgSQL_escape_string($_GET['code']);
pgSQL/perl對策:$code=~s/'/"/g; $code=~s/\\/\\\\/g;
SQLite/php對策:$code=SQLite_escape_string($_GET['code']);
OS Commmand Injection
Linux/php對策:$safe_text=escapeshellarg($text);
Linux/perl對策:$test=~s/'/\\'/g;
cross site scripting
php對策:$data=htmlspecialchars($data);
perl對策:$data=~s/</&lt;/g;

參考資料:Ajax與Google Map API 入門實作

jck11 發表在 痞客邦 PIXNET 留言(0) 人氣()