美文网首页程序员
Java安全编程指南

Java安全编程指南

作者: 欧余山南 | 来源:发表于2017-10-27 16:22 被阅读0次

    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

    }
    }

    相关文章

      网友评论

        本文标题:Java安全编程指南

        本文链接:https://www.haomeiwen.com/subject/lafdpxtx.html