前言:Java是一门很棒的语言,Java开发者就像掌握了一把有力的工具,一旦学习可以做非常多有用的东西,可以进行网页开发,客户端开发,安卓端开发,可是Java安全和安全性的开发并不是所有开发者都会的一部分的内容。
在本教程中,我介绍了Java中安全性基本架构。了解Java如何为提供一些标准加密服务和身份认证的实现。还有一些常见的模式,应用这些模式在身份验证和访问控制等领域实现可扩展安全性。
不过,这只是给提供了一个窥见Java安全特性的机会。因此,本教程中讨论的每个领域都值得进一步探索。
一、Java注入数据库查询问题:
如果存在数据库,并且数据库的查询语句参数被自然而然地作为静态查询的一部分,那么就会导致数据库泄露获取信息。
代码实战:
public void selectExample(String parameter) throws SQLException {
Connection connection = DriverManager.getConnection(DB_URL, USER, PASS);
String query = "SELECT * FROM USERS WHERE lastname = " + parameter;
Statement statement = connection.createStatement();
ResultSet result = statement.executeQuery(query);
printResult(result);
}
我们直接在这个代码中的参数加入'' OR 1=1
,那么查询结果就会正确返回表中的每一项数据,在多个连续查询的情况下,写入参数' '; UPDATE USERS SET LASTNAME= ' '
,那么可以造成ID直接修改,直接修改数据库中的信息。
实战反击:
我们该如何修改这种错的写法呢?首先采用参数化查询写成java语句,什么是参数化查询呢?就是使用完整的query语句,不使用拼接的query语句。
对比前后正确和错误的写法。
String query = "SELECT * FROM USERS WHERE lastname = ?";
String query = "SELECT * FROM USERS WHERE lastname = " + parameter;
然后接下来是如何实现剩下的查询呢?
创建一个Statement类的对象来把parameter转为String,setString方法将给定的字符串写入实例statement
public void prepStatmentExample(String parameter) throws SQLException {
Connection connection = DriverManager.getConnection(DB_URL, USER, PASS);
String query = "SELECT * FROM USERS WHERE lastname = ?";
PreparedStatement statement = connection.prepareStatement(query);
statement.setString(1, parameter);//代表从第一个位置读取字符,parameter为传入的值
System.out.println(statement);
ResultSet result = statement.executeQuery();
printResult(result);
}
SetString是java.sql.Clob接口中的一个方法,它根据给定的偏移量和长度,将给定的字符串从给定的位置开始写入。其中clob.setString(1, content);
给出了其中的重要一步。如下:
@Override
public void setClobAsString(PreparedStatement ps, int paramIndex, String content) throws SQLException {
Clob clob = ps.getConnection().createClob();
clob.setString(1, content);
ps.setClob(paramIndex, clob);
}
二、Java主要安全风险处理框架:
创建身份认证过程中会出现很多的安全问题,这些问题会产生许多的安全风险,因为基于现在OAuth身份认证方式和身份管理在网络中都不是一件容易的事情,所以最关键的一步和有效的是创建账户的过程。
使用Open ID Connect可以达到安全的解决方法,给出网址:https://openid.net/connect/
通过跨网站和应用的身份验证,不用管理密码文件,他是OAuth的升级版,可安全提供用户信息。在终端的/userinfo
文件下支持动态管理信息。
直接使用Spring Security库中的设置OpenID Connect,增加双因素身份认证和多因素身份认证。创建应用程序后,您只需将它连接到选择的特定客户端,适用于Github,谷歌,百度等等你需要很重要使用的地方。
代码实战:
我的POM.XML设置为
x<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
我的application.yaml设置为:
spring:
security:
oauth2:
client:
registration:
github:
client-id: 796b0e5403be4729ca01
client-secret: f379318daa27502254a05e054361074180b840a9
okta:
client-id: 0oa1a4wascEpYu6yk358
client-secret: hqxj7a9lVe_TudbS2boBW7AWwxTlZiHNrJxdc_Sk
client-name: Okta
provider:
okta:
issuer-uri: https://dev-844689.okta.com/oauth2/default
三、修复已知漏洞就是最大的帮助:
Java已经的漏洞一般出现在依赖组件中,通过扫描程序中的所有组件,然后检索漏洞版本数据库,一般找对应版本就可以,所以寻找起来很快的,而且组件可以直接通过扫描就知道了。
确保所有使用的开源组件中没有(已知)安全漏洞,如果有,立刻升级组件,因为开源组件会把已公开漏洞版本做升级,减少漏洞和数据泄露的发生。
推荐使用Bell-Soft,下载地址:https://bell-sw.com/pages/downloads/,安装之后执行命令:
dependency-check.bat --project Dependency-Check-Web –scan "C:\Documents\java\lib"
备选:Snyk, Xray Jfrog, and Black Duck都可以作为扫描器。
全平台都支持。非常的好用。
四、总结:
把安全的Java开发当成基本的开发方法,开发意识和开发方案,能帮助Java方面的编程能力走得更好,因为怎么能只要开发好网页,不要安全应用呢,希望可以多多探索。
资料链接:
1.https://docs.microsoft.com/en-us/connectors/custom-connectors/policy-templates/setqueryparameter/setqueryparameter
2.https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html
3.https://www.tutlane.com/tutorial/aspnet-mvc/how-to-use-querystring-parameters-in-asp-net-mvc-to-retrieve-or-send-data
4.https://bell-sw.com/announcements/2021/12/08/vulnerability-scanning-for-java-apps/
5.https://snyk.io/blog/log4j-rce-log4shell-vulnerability-cve-2021-44228/
6.https://openid.net/connect/
7.https://bell-sw.com/pages/downloads/