SQL注入防范
SQL注入指利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的攻击方法。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 的注入问题,恶意用户的输入没有经过严格的控制并最终显示给来访的用户,导致能在来访用户的浏览器里以浏览用户的身份执行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);
应该对文件名做严格的检查,比如使用正则表达式,限定文件名只能包括字母和数字。
外部程序调用漏洞
应避免在程序中调用系统命令,如果必须使用系统命令,应对输入参数做严格的过滤,一段存在漏洞的程序如下:
String ip = request.getParameter(“ip”);
Process p = Runtime.getRuntime().exec(“/bin/sh nslookup ” + ip);
应使用正则表达式对输入的参数(IP)做严格过滤,否则用户可以提交如下格式的IP数据:
192.168.0.1; [自己的命令]来执行自己的命令。
整数溢出
一段存在漏洞的程序如下:
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
…
}
}
网友评论