SQL注入防范
SQL注入指利用現(xiàn)有應用程序漓糙,將(惡意)的SQL命令注入到后臺數據庫引擎執(zhí)行的攻擊方法组民。Java程序存在SQL注入問題奕筐,能通過使用PreparedStatement類來阻止SQL注入。
一段可能產生SQL注入的代碼如下:
String user = request.getParameter("username");
String pass = request.getParameter("password");
String query = "SELECT id FROM users WHERE username="+user+" AND
password="+pass;
Statement stmt = con.createStatement(query);
ResultSet rs = con.executeQuery(query);
if (rs.next())
{
// 登錄成功
int id = rs.getInt(1);
...
}
else
{
// 登錄失敗
...
}
正確的做法如下:
String user = request.getParameter("username");
String pass = request.getParameter("password");
String query = "SELECT id FROM users WHERE username=? AND password=?";
PreparedStatement stmt = con.prepareStatement(query);
stmt.setString(1, user);
stmt.setString(2, pass);
ResultSet rs = stmt.executeQuery();
if (rs.next())
{
// 登錄成功
int id = rs.getInt(1);
...
}
else
{
// 登錄失敗
...
}
跨站腳本攻擊防范
跨站腳本漏洞本質是 Html 的注入問題钓觉,惡意用戶的輸入沒有經過嚴格的控制并最終顯示給來訪的用戶,導致能在來訪用戶的瀏覽器里以瀏覽用戶的身份執(zhí)行Html代碼坚踩,數據流程如下:
惡意用戶的Html輸入—>web程序—>數據存儲—>web程序—>用戶瀏覽器荡灾。
Html代碼的示例:
<script src="http://www.loveshell.jpg" width=100 onerror=alert("載入圖片錯誤!")>
<>是瀏覽器的一個 Html 標記,img 是<>標記的名稱瞬铸,src 是<>的第一個屬性批幌,=后面是 src 的值,width 是第二個屬性嗓节,onerror 是標記的事件屬性荧缘。個 Html 標記包括很多元素,并不是輸入<>才會存在HTML注入拦宣,其實只要你的輸入處在Html標簽內截粗,產生了新的元素或者屬性信姓,就產生跨站腳本攻擊!
對輸出做做HTML關鍵字過濾绸罗,能防止跨站腳本意推。
一段可能產生跨站腳本攻擊漏洞的代碼如下:
String name = request.getParameter(“name”);
out.println(“hello, welcome <b>” + name + “</b> !”);
正確的做法如下,應該至少過濾’(單引號)珊蟀、”(雙引號)菊值、<、>育灸、TAB 鍵俊性、&、#描扯、script定页。
String name = request.getParameter(“name”);
out.println(“hello, welcome <b>” + htmlEncode(name) + “</b> !”);
….
public String htmlEncode(String sText) {
sText = sText.replaceAll(“&”, “&”);
sText = sText.replaceAll(“#”, “#”);
sText = sText.replaceAll(“’”, “"e;”);
sText = sText.replaceAll(“\””, “"e;”);
sText = sText.replaceAll(“<”, “<”);
sText = sText.replaceAll(“>”, “>”);
sText = sText.replaceAll(“script”, “”);
}
防范跨站腳本攻擊應過濾以下特殊字符:
特殊/關鍵字符
'(單引號)
"(雙引號)
<
>
空格鍵
TAB 鍵
Script
&
驗證輸入文件名
從用戶接收輸入文件名時绽诚,應確保文件名具有嚴格的格式典徊。
一段有漏洞的程序:
String fileName = request.getParameter("filename");
String content = request.getParameter("content");
FileWriter fw = new FileWriter(new File(“/home/y/share/templates/” + fileName));
fw.write(content);
應該對文件名做嚴格的檢查,比如使用正則表達式恩够,限定文件名只能包括字母和數字卒落。
外部程序調用漏洞
應避免在程序中調用系統(tǒng)命令,如果必須使用系統(tǒng)命令蜂桶,應對輸入參數做嚴格的過濾儡毕,一段存在漏洞的程序如下:
String ip = request.getParameter(“ip”);
Process p = Runtime.getRuntime().exec(“/bin/sh nslookup ” + ip);
應使用正則表達式對輸入的參數(IP)做嚴格過濾,否則用戶可以提交如下格式的IP數據:
192.168.0.1; [自己的命令]來執(zhí)行自己的命令扑媚。
整數溢出
一段存在漏洞的程序如下:
public void sample(byte[] b, int off, int len) {
if (len < 0 || off < 0 || len + off > b.length) {
// do A
……
} else {
// do B
……
}
}
正確的做法如下:
public void sample(byte[] b, int off, int len) {
if (len < 0 || off < 0 || len > b.length - off) {
// do A
……
} else {
// do B
…
}
}