当前位置 : 主页 > 编程语言 > java >

java安全规范

来源:互联网 收集:自由互联 发布时间:2022-06-30
安全问题其实是很多程序员想了解又容易忽略的问题,但需要我们重视起来,提高应用程序的安全性。常出现的安全问题包括,程序接受数据可能来源于未经验证的用户,网络连接和其

安全问题其实是很多程序员想了解又容易忽略的问题,但需要我们重视起来,提高应用程序的安全性。常出现的安全问题包括,程序接受数据可能来源于未经验证的用户,网络连接和其他不受信任的来源,如果未对程序接受数据进行校验,则可能会引发安全问题等等,具体也可以分成以下几方面:

  • 数据校验
  • 敏感信息
  • 加密算法
  • 序列化与反序列化
  • I/O操作
  • 多线程安全
  • 框架和组件

java安全规范_sql

数据校验

数据校验-校验策略

1. 白名单策略 -接受已知好的数据( 任何时候,尽可能使用“白名单”的策略 )

下面的示例代码确保 name参数只包含字母、以及下划线

if (Pattern.matches("^[0 -9A -Za -z_]+$", name)){
throw new IllegalArgumentException("Invalid name");
}

2. 黑名单策略 -拒绝已知好的数据

public String removeJavascript(String input){
Pattern p = Pattern.compile("javascript", Pattern.CASE_INSENSITIVE );
Matcher m = p.matcher(input);
return (! m.matches()) ? input : "";
}

3. 白名单净化

对数据中任何不属于某个已验证的、合法字符列表进行删除编码或者替换,然后再使用这些净化的数据

4. 黑名单净化: 剔除或者转换某些字符(例如,删除引号、转换成HTML实体)

public static String quoteApostrophe(String input){
if (input != null){
return input.replaceAll(" \'","’");
} else{
return null;
}
}

数据校验 -输入输出

规则1.1 校验跨信任边界传递的不可数据**

程序接受的不可信数据源跨越任边界传递必须经过内校验,包括输入和出校验。

不可信数据:用户、网络连接等源 不可信数据:用户、网络连接等源

数据入口:

  • 终端计算机
  • 互联网出入口
  • 广域网出入口
  • 公司对外发布服务的 DMZ服务器
  • VPN和类似远程连接设备。
  • 信任边界:根据威胁建模划分的信任边 如 web 应用的服务端;

    规则 1.2:禁止直接使用不可信数据来拼SQL语句

    SQL 注入是指原始SQL查询被动态更改成一个与程序预期完全不同的查询。执行这样后可能导致信息泄露或者数据被篡改。防止 SQL注入的方式主要可以分为两类:

  • 使用参数化查询 (推荐使用)
  • 对不可信数据进行校验
  • 预编译处理
  • Statement stmt= null;
    ResultSet rs= null;
    try{
    String userName= ctx.getAuthenticatedUserName(); //this is a constant
    String sqlString= "SELECT * FROM t_item
    WHERE owner='" + userName+ "' AND itemName='" + request.getParameter("itemName") + "'";

    stmt= connection.createStatement();
    rs= stmt.executeQuery(sqlString);// ... result set handling
    }
    添加 name' OR 'a' = 'a
    SELECT * FROM t_item WHERE owner = 'wiley' AND itemname= 'name' OR 'a'='a';

    预编译处理:

    PreparedStatement stmt= null
    ResultSet rs=null
    try
    {

    String userName= ctx.getAuthenticatedUserName(); //this is a constant

    String itemName= request.getParameter("");

    // ...Ensure that the length of userName and itemNameis legitimate
    // ...

    String sqlString= "SELECT * FROM t_item WHERE owner=? AND itemName=?";

    stmt= connection.prepareStatement(sqlString);
    stmt.setString(1, userName);
    stmt.setString(2, itemName);
    rs=stmt.executeQuery();
    // ... result set handling
    }catch(SQLExceptions e)
    {
    // ... logging and error handling
    }

    在存储过程中,通拼接参数值来构建查询字符串和应用序代码一样同是有SQL注入风险

    上一篇:【Java 线程系列】Java 天生就是多线程
    下一篇:没有了
    网友评论