(SAST检测规则-8)连接字符串中的硬编码密码

严重等级:高危

缺陷详解:

在构建数据驱动的应用程序时,开发者通常需要通过数据库连接字符串与数据库进行交互。将敏感信息(如密码、服务器IP地址或加密密钥)硬编码在源代码中会带来以下风险:

  1. 信息暴露:硬编码的密码、IP地址或密钥可能被反编译工具提取,从而被攻击者利用。
  2. 代码维护困难:调试和生产环境的配置不同,每次环境切换都需要手动修改代码和重新编译,增加维护成本。
  3. 法律后果:敏感信息的泄露可能违反行业法规,如 ITAR(国际武器贸易条例)或 HIPAA(健康保险流通与责任法案),引发法律责任。
  4. 易受攻击:如果恶意用户获得了源代码或类文件,他们可以直接读取硬编码的信息,绕过其他安全机制。

导致结果和风险:

  1. 硬编码的敏感信息容易被攻击者利用,导致数据泄露或未经授权的访问。
  2. 敏感数据泄露可能影响企业的合规性,带来法律和声誉风险。

缓解和预防措施:

  1. 配置外部化:将数据库连接信息从代码中分离出来,存储在加密的配置文件、环境变量或专用的密钥管理系统中。
  2. 加密存储:敏感信息应加密存储,并在运行时通过安全机制解密。
  3. 访问控制:确保敏感配置文件或密钥管理系统的访问权限受到严格控制。
  4. 最小权限原则:数据库账户应设置为只具有最低限度的操作权限,避免因密码泄露导致更大范围的风险。

测试用例

修复前的测试用例(存在漏洞):

import java.sql.Connection;

import java.sql.DriverManager;

public class HardcodedPasswordExample {

    public static void main(String[] args) {

        try {

            // 在代码中硬编码数据库连接字符串,包括用户名和密码

            String url = "jdbc:mysql://prod.company.com/production";

            String username = "root";

            String password = "lamepassword"; // 硬编码的密码

            // 使用硬编码信息连接数据库

            Connection connection = DriverManager.getConnection(url, username, password);

            System.out.println("数据库连接成功!");

        } catch (Exception e) {

            System.out.println("数据库连接失败!");

            e.printStackTrace();

        }

    }

}

漏洞分析:

  • 问题:数据库连接的敏感信息直接硬编码在程序中,易被反编译工具提取。
  • 风险:攻击者可通过代码或编译文件直接获取敏感信息,访问数据库。

修复后的测试用例(安全实现):

import java.sql.Connection;

import java.sql.DriverManager;

import java.util.Properties;

import java.nio.file.Files;

import java.nio.file.Paths;

public class SecurePasswordExample {

    public static void main(String[] args) {

        try {

            // 从外部配置文件加载数据库连接信息

            Properties props = new Properties();

            props.load(Files.newInputStream(Paths.get("config.properties")));

            // 从配置文件中读取连接字符串、用户名和密码

            String url = props.getProperty("db.url");

            String username = props.getProperty("db.username");

            String password = props.getProperty("db.password");

            // 使用安全加载的配置信息连接数据库

            Connection connection = DriverManager.getConnection(url, username, password);

            System.out.println("数据库连接成功!");

        } catch (Exception e) {

            System.out.println("数据库连接失败!");

            e.printStackTrace();

        }

    }

}

修复点:

  • 将敏感信息存储在 外部加密配置文件(如 config.properties)中,而非硬编码。
  • 配置文件的访问权限受到严格控制,防止未授权访问。

示例配置文件(config.properties):

db.url=jdbc:mysql://prod.company.com/production

db.username=root

db.password=securepassword123


补充测试用例:

1. 使用环境变量存储密码:

public class EnvVariableExample {

    public static void main(String[] args) {

        try {

            // 从环境变量中加载敏感信息

            String url = System.getenv("DB_URL");

            String username = System.getenv("DB_USERNAME");

            String password = System.getenv("DB_PASSWORD");

            // 使用环境变量连接数据库

            Connection connection = DriverManager.getConnection(url, username, password);

            System.out.println("数据库连接成功!");

        } catch (Exception e) {

            System.out.println("数据库连接失败!");

            e.printStackTrace();

        }

    }

}

2. 使用密钥管理系统:

public class SecureKeyManagementExample {

    public static void main(String[] args) {

        try {

            // 从密钥管理系统加载敏感信息

            String url = SecretManager.get("db.url");

            String username = SecretManager.get("db.username");

            String password = SecretManager.get("db.password");

            // 使用密钥管理系统的值连接数据库

            Connection connection = DriverManager.getConnection(url, username, password);

            System.out.println("数据库连接成功!");

        } catch (Exception e) {

            System.out.println("数据库连接失败!");

            e.printStackTrace();

        }

    }

}

漏洞修复后的优势:

  • 密钥管理系统和环境变量保护了敏感信息,降低被暴露的风险。
  • 数据库连接信息的动态管理提升了代码可维护性。

参考:

  • CWE-259: Use of Hard-coded Password
  • OWASP Top Ten: A3-Sensitive Data Exposure

工作:SAST工具推介、评测、代码审计、培训资料、应用安全咨询、SAST检测规则、安全漏洞数据处理、许可证数据处理、组件数据处理等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/63847.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot整合 RabbitMQ

文章目录 一. 引入依赖二. 添加配置三. Work Queue(工作队列模式)声明队列生产者消费者 四. Publish/Subscribe(发布订阅模式)声明队列和交换机生产者消费者 五. Routing(路由模式)声明队列和交换机生产者消费者 六. Topics(通配符模式)声明队列和交换机生产者消费者 一. 引入依…

Qwen 论文阅读记录

本文仅作自己初步熟悉大模型,梳理之用,慢慢会更改/增加/删除,部分细节尚未解释,希望不断学习之后,能够完善补充。若有同道之人,欢迎指正探讨。 关于后面的code-qwen and math-qwen,我个人认为依…

Python 元类(Meta Class):解密 Python 面向对象编程的幕后推手

在 Python 编程中,我们每天都在和类打交道,但是你是否也和我一样想过:类本身是什么?是谁创建了类?元类(Meta Class)就是用来创建类的"类"。今天让我们一起深入理解这个强大而神秘的特…

JCR一区牛顿-拉夫逊优化算法+分解对比!VMD-NRBO-Transformer-BiLSTM多变量时序光伏功率预测

JCR一区牛顿-拉夫逊优化算法分解对比!VMD-NRBO-Transformer-BiLSTM多变量时序光伏功率预测 目录 JCR一区牛顿-拉夫逊优化算法分解对比!VMD-NRBO-Transformer-BiLSTM多变量时序光伏功率预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.中科院…

如何在小米平板5上运行 deepin 23 ?

deepin 23 加入了 ARM64 支持,这里尝试将 deepin 系统刷入平板中,平常使用中,带个笔记本电脑有时候也会嫌比较麻烦,把 Linux 系统刷入平板中既满足了使用需要,又满足了轻便的需求。为什么不使用 Termux ?虽…

QT6 Socket通讯封装(TCP/UDP)

为大家分享一下最近封装的以太网socket通讯接口 效果演示 如图,界面还没优化,后续更新 废话不多说直接上教程 添加库 如果为qmake项目中,在.pro文件添加 QT network QT core gui QT networkgreaterThan(QT_MAJOR_VERS…

all/any函数可以对“条件”打包(Python)

操作符直观易读适用简单逻辑,函数紧凑好写便于多条件处理。 (笔记模板由python脚本于2024年12月12日 22:19:10创建,本篇笔记适合有一定编程基础的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网:https://www.python.org/ Free&#xff…

js:v-for循环中我希望再次循环七张图片,需要在v-for中嵌套一个v-for还是?

问: div classxxxx v-for(item,index) in data :keyindex div classimgDiv div classimgDivBox /div /div .imgDivBox { .background-img(/assets/images/top_01.png) } 这是现在设置的图片,但是现在我希望遍历一个数组然后遍历top01-top07&…

Java使用MVEL公式引擎

为了增加更多的常用方法,如 sum、max 和 min 等等,我们可以扩展 Helper 类以包含这些方法。这样,MVEL 表达式就可以直接调用这些方法来执行相应的计算。我们将确保这些方法可以处理多种数值类型,并且返回适当的数值类型&#xff0…

黑皮书-计算机科学导论02

目录 第二部分:计算机硬件 第5章计算机组成 5.1中央处理单元 Ⅰ.算数逻辑单元 Ⅱ.控制单元 Ⅲ.寄存器 5.2主存储器 Ⅰ.随机存取存储器(RAM) Ⅱ.只读存储器(ROM) 高速缓冲存储器(Cache) 5.3输入/输出子系统 Ⅰ.非存储设备 Ⅱ.存储设备(辅助存…

小程序开发中的插件生态与应用-上

更多精彩内容都在公zhong号:小白的大数据之旅 在小程序的开发过程中,插件作为扩展功能、提升效率的重要工具,扮演着不可或缺的角色。它们不仅能够帮助开发者快速集成复杂的功能模块,还能优化开发流程,缩短项目周期。 …

优选算法——分治(快排)

1. 颜色分类 题目链接:75. 颜色分类 - 力扣(LeetCode) 题目展示: 题目分析:本题其实就要将数组最终分成3块儿,这也是后面快排的优化思路,具体大家来看下图。 这里我们上来先定义了3个指针&…

go开发中interface和方法接收器的使用

Go 语言中的接口和方法接收器学习 Go 中的 interface 就像是一个神奇的魔法杖,能让你轻松地将不同的类型拉到同一个阵营里。与其他语言的接口不同,Go 的接口无需显式声明“我实现了你”,只要你满足了接口规定的方法,Go 就会自动认…

llm chat场景下的数据同步

背景 正常的chat/im通常是有单点登录或者利用类似广播的机制做多设备间内容同步的。而且由于长连接的存在,数据同步(想起来)相对简单。而llm的chat在缺失这两个机制的情况下,没见到特别好的做到了数据同步的产品。 llm chat主要两…

【大模型系列篇】GPU资源容器化访问使用指南

在当今的高性能计算和机器学习领域,GPU(图形处理单元)因其卓越的并行计算能力而扮演着至关重要的角色。随着容器化技术如 Docker 的普及,越来越多的数据科学家和开发者选择将他们的应用和工作负载封装到 Docker 容器中&#xff0c…

【毕业设计选题】数据科学与大数据专业毕业设计选题与建议

目录 前言 毕设选题 开题指导建议 更多精选选题 选题帮助 最后 前言 大家好,这里是海浪学长毕设专题! 大四是整个大学期间最忙碌的时光,一边要忙着准备考研、考公、考教资或者实习为毕业后面临的升学就业做准备,一边要为毕业设计耗费大量精力。学长给大家整…

大数据笔记之flink-cdc实时同步数据

大数据笔记之flink-cdc实时同步数据(mysql -->doris) 一、基本概念 Flink CDC 是一个基于流的数据集成工具,旨在为用户提供一套功能更加全面的编程接口(API)。 该工具使得用户能够以 YAML配置文件的形式,优雅地定义其 ETL&…

蓝桥杯新年题解 | 第15届蓝桥杯迎新篇

蓝桥杯新年题解 | 第15届蓝桥杯迎新篇 2024年的蓝桥杯即将拉开序幕!对于许多编程爱好者来说,这不仅是一次展示自我能力的舞台,更是一次学习和成长的机会。作为一名大一新生的小蓝,对蓝桥杯充满了期待,但面对初次参赛的…

【有啥问啥】大语言模型Prompt中的“System指令”:深入剖析与误区澄清

大语言模型Prompt中的“System指令”:深入剖析与误区澄清 引言 在与大语言模型(LLM)交互时,“prompt”(提示符)这一概念已不再陌生。Prompt是引导模型生成特定类型文本的关键输入,决定了模型的…

linux/centOS7用户和权限管理笔记

linux系列中可以: 配置多个用户配置多个用户组用户可以加入多个用户中 linux中关于权限的管理级别有2个级别,分别是: 针对用户的权限控制针对用户组的权限控制 一,root用户 root用户拥有最大的系统操作权限,而普通…