Java进阶 | Java注入安全策略,代码实战

Posted Hdparm

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java进阶 | Java注入安全策略,代码实战相关的知识,希望对你有一定的参考价值。

前言: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/,安装之后执行命令:

Java进阶

dependency-check.bat --project Dependency-Check-Web –scan "C:\\Documents\\java\\lib"

备选:Snyk, Xray Jfrog, and Black Duck都可以作为扫描器。

全平台都支持。非常的好用。

Java进阶

四、总结:

把安全的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/


以上是关于Java进阶 | Java注入安全策略,代码实战的主要内容,如果未能解决你的问题,请参考以下文章

JVM进阶之沙箱安全模型

JVM进阶之沙箱安全模型

《java并发编程实战》读书笔记3--对象的组合

如何防止网站被SQL注入攻击之java网站安全部署

Spring实战

java并发编程实战:第五章----基础构建模块