瑞_Java开发手册_(四)安全规约

news2025/2/27 5:00:22

🙊前言:本文章为瑞_系列专栏之《Java开发手册》的安全规约篇。由于博主是从阿里的《Java开发手册》学习到Java的编程规约,所以本系列专栏主要以这本书进行讲解和拓展,有需要的小伙伴可以点击链接下载。本文仅供大家交流、学习及研究使用,禁止用于商业用途,违者必究!

本系列第一篇链接:(一)编程规约
本系列第二篇链接:(二)异常日志
本系列第三篇链接:(三)单元测试

在这里插入图片描述

安全规约的意义

  安全规约主要是为了保障代码的安全性,从而减少系统被攻击的风险。安全规约包括但不限于防止SQL注入、XSS攻击、CSRF攻击、文件上传漏洞、文件包含漏洞等方面的安全问题。制定这些规则的目的并不是为了约束和禁锢开发者的创造力,而是为了帮助大家能够在正确的道路上,尽可能的避免踩坑和跑偏。规则可能会对代码实现造成影响,但是制定规则的主要目标是为了让大多数程序员小伙伴可以得到更多的好处。如果在团队实际运作中认为某个规则无法遵循或有更好的做法,希望大家可以共同改进该规范。

  安全规约的意义在于:

  • 防止安全漏洞:安全规约提供了一系列的安全实践和建议,帮助开发者避免常见的安全漏洞,如SQL注入、跨站脚本攻击(XSS)等。
  • 提高代码质量:遵循安全规约可以促使开发者编写更加健壮、可靠的代码。通过避免不安全的代码实践,可以提高代码的整体质量,减少潜在的错误和问题。
  • 增强安全性意识:安全规约强调了安全在软件开发中的重要性,促使开发者更加关注安全性问题。通过学习和遵守安全规约,可以提高开发者的安全意识,使安全性成为整个开发团队共同关注的问题。
  • 统一安全标准:安全规约可以作为统一的安全标准,确保所有开发人员遵循相同的最佳实践和准则。这有助于在整个项目中保持一致的安全水平,并减少安全相关的风险。
  • 减少维护成本:遵循安全规约可以降低软件维护成本。安全的代码更易于维护、调试和使用,减少了对安全问题的修复和加固的成本。
  • 合规性:对于一些特定行业或应用场景,可能需要遵循特定的安全标准和法规。遵循安全规约可以帮助开发者确保其代码符合这些标准和法规要求,避免因不合规导致的法律风险和责任。

安全规约

  1. 【强制】隶属于用户个人的页面或者功能必须进行权限控制校验。
    说明:防止没有做水平权限校验就可随意访问、修改、删除别人的数据,比如查看他人的私信内容。

瑞:水平权限校验是指对用户个人页面或功能的访问权限进行校验,以确保只有经过授权的用户才能访问或修改特定的数据。这种校验通常用于防止未授权的用户随意访问、修改或删除他人的数据,以保护数据的隐私和安全性

  1. 【强制】用户敏感数据禁止直接展示,必须对展示数据进行脱敏。
    说明:中国大陆个人手机号码显示为:137****0969,隐藏中间 4 位,防止隐私泄露。

瑞:手机号脱敏代码如下(正则表达式参考):

    public static String maskPhoneNumber(String input) {
        // 匹配手机号的正则表达式
        String phonePattern = "(\\d{3})\\d{4}(\\d{4})";
        // 数据脱敏,将匹配到的手机号中间四位替换为星号
        return input.replaceAll(phonePattern, "$1****$2");
    }
  1. 【强制】用户输入的 SQL 参数严格使用参数绑定或者 METADATA 字段值限定,防止 SQL 注入,禁止字符串拼接 SQL 访问数据库。
    反例:某系统签名大量被恶意修改,即是因为对于危险字符 # --没有进行转义,导致数据库更新时,where后边的信息被注释掉,对全库进行更新。

瑞:❗️本条为神坑 ❗️ 有小可爱在使用 JDBC 编写SQL时为了方便调试❌选择用如String.format的方式拼接SQL语句❌,拼接出的SQL语句如下所示,假设现在用户使用Ray ' -- (注意要空格,SQL注入)为需要修改的用户名,直接导致where语句之后的信息全部被注释,导致了全表更新❗️ ❗️ ❗️
  UPDATE `user` SET nick_name = 'Ray '-- ’ WHERE is_deleted = 0 and id = 1
  如果是使用MyBatis等框架,请使用:#{},#param# 。不要使用${} 此种方式容易出现 SQL 注入。

  1. 【强制】用户请求传入的任何参数必须做有效性验证。
    说明:忽略参数校验可能导致:
    • page size 过大导致内存溢出
    • 恶意 order by 导致数据库慢查询
    • 缓存击穿
    • SSRF
    • 任意重定向
    • SQL 注入,Shell 注入,反序列化注入
    • 正则输入源串拒绝服务 ReDoS

      Java 代码用正则来验证客户端的输入,有些正则写法验证普通用户输入没有问题,但是如果攻击人员使用的是特殊构造的字符串来验证,有可能导致死循环的结果。

瑞:本条建议配合测试使用

  1. 【强制】禁止向 HTML 页面输出未经安全过滤或未正确转义的用户数据。

瑞:为了防止跨站脚本攻击(XSS)

  1. 【强制】表单、AJAX 提交必须执行 CSRF 安全验证。
    说明:CSRF(Cross-site request forgery)跨站请求伪造是一类常见编程漏洞。对于存在 CSRF 漏洞的应用/网站,攻击者可以事先构造好 URL,只要受害者用户一访问,后台便在用户不知情的情况下对数据库中用户参数进行相应修改。

  2. 【强制】URL 外部重定向传入的目标地址必须执行白名单过滤。

瑞:如果服务端未对传入的跳转url变量进行检查和控制,恶意攻击者可以构造一个恶意地址,诱导用户跳转到恶意网站。由于跳转是从用户信任的站点进行的,用户很可能会不加怀疑地信任该跳转,从而受到钓鱼攻击或其他网络欺诈。所以,为了开发人员的清白,懂的都懂💦

  1. 【强制】在使用平台资源,譬如短信、邮件、电话、下单、支付,必须实现正确的防重放的机制,如数量限制、疲劳度控制、验证码校验,避免被滥刷而导致资损。
    说明:如注册时发送验证码到手机,如果没有限制次数和频率,那么可以利用此功能骚扰到其它用户,并造成短信平台资源浪费。

瑞:尤其是登录密码校验,如果不设置限制和频率,那么密码就容易被暴力破解

  1. 【推荐】发贴、评论、发送即时消息等用户生成内容的场景必须实现防刷、文本内容违禁词过滤等风控策略。

瑞:博主认为本条不应该是推荐,而是【强制】,同第7条,懂的都懂




本文是博主的粗浅理解,可能存在一些错误或不完善之处,如有遗漏或错误欢迎各位补充,谢谢

  如果觉得这篇文章对您有所帮助的话,请动动小手点波关注💗,你的点赞👍收藏⭐️转发🔗评论📝都是对博主最好的支持~


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

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

相关文章

springboot学生信息管理系统

🍅点赞收藏关注 → 私信领取本源代码、数据库🍅 本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目希望你能有所收获,少走一些弯路。🍅关注我不迷路🍅一 、设计说明 1.1研究背景 随着…

【Windows】基于Hyper-V安装Ubuntu虚拟机

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍基于Hyper-V安装Ubuntu虚拟机。 学其所用,用其所学。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下次更新…

22款奔驰C260L升级ACC自适应巡航 解放双脚 出行更加安全

有的时候你是否厌倦了不停的刹车、加油?是不是讨厌急刹车,为掌握不好车距而烦恼? 如果是这样,那么就升级奔驰原厂ACC自适应式巡航控制系统,带排队自动辅助和行车距离警报功能,感受现代科技带给你的舒适安全…

监测服务器硬件设备运行状况的软件 - wgcloud

WGCLOUD是一款开源免费的运维平台,具有轻量,高效,性能稳定,部署简单,上手容易等特点 WGCLOUD可以监测服务器的cpu,内存,磁盘,负载,磁盘,缓存,网络…

【rust/bevy】从game template开始

目录 说在前面步骤进入3D控制方块问题 说在前面 操作系统:win11rust版本:rustc 1.77.0-nightlybevy版本:0.12 步骤 rust安装 这里 windows下建议使用msvc版本bevy安装 这里clone代码git clone https://github.com/NiklasEi/bevy_game_templa…

Docker运行RabbitMQ并使用SpringAMQP操作

文章目录 一、RabbitMQ运行二、整合SpringAMQP1. 引入依赖 三、测试1. 消费者2. 生产者3. 运行 一、RabbitMQ运行 拉取docker镜像 docker pull rabbitmq:3-management基础运行命令 docker run \-e RABBITMQ_DEFAULT_USERrabbitmq \-e RABBITMQ_DEFAULT_PASSrabbitmq \--name…

高效办公:如何通过在文件名称右边添加关键字提升工作效率

在繁忙的办公环境中,经常要处理大量的文件和资料。那如何管理和查找这些文件呢,常见的方法有在文件名称右边添加关键字。下面来看云炫文件管理器如何通过在文件名称右边添加关键字来提升工作效率。 在文件名称右边添加关键字前后效果图。 文件名批量添加…

Blazor 的基本原理探索

背景 为了提升开发效率,关键是对js不够熟悉,所以要使用C#进行全栈的开发,使用了mudblazor和radzen blazor,以及可能会用到其他的blazor组件,所有很有必要对blazor有个比较全面的不求甚解,其基本原理以及bl…

AI-数学-高中-5.求函数解析式(4种方法)

原作者视频:函数】3函数解析式求法(易)_哔哩哔哩_bilibili 1.已知函数类型-待定系数法:先用待定系数法把一次或二次函数一般表达式写出来;再用“要变一起变”左右两边同时替换,计算出一般表达式的常数&…

(分享) 音乐软件Spotify-声破天8.9.4

​【应用名称】:Spotify-声破天 ​【适用平台】:#Android ​【软件标签】:#Spotify ​【应用版本】:8.8.96 → 8.9.4 ​【应用大小】:67MB ​【软件说明】:软件升级更新。iOS可配合qx小火箭类的工具对…

P1179 [NOIP2010 普及组] 数字统计————C++

目录 [NOIP2010 普及组] 数字统计题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 提示 解题思路Code1Code2运行结果 [NOIP2010 普及组] 数字统计 题目描述 请统计某个给定范围 [ L , R ] [L, R] [L,R] 的所有整数中,数字…

ivrobot乐高EV3 鲸鱼 能力风暴自制遥控手柄库文件和编程样例 使用指南

编程示例: 资源下载链接: https://download.csdn.net/download/abilix_tony/88739582 EV3 mindstorms能用基础版和高阶版(条形编程界面) EV3 classroom只能用基础版 (scratch模块形状编程界面) 请根据使…

基于Xilinx K7-410T的高速DAC之AD9129开发笔记(二)

引言:上一篇文章我们简单介绍了AD9129的基础知识,包括芯片的重要特性,外部接口相关的信号特性等。本篇我们重点介绍下项目中FPGA与AD9129互联的原理图设计,包括LVDS IO接口设计、时钟电路以、供电设计以及PCB设计。 LVDS数据接口设…

设计一个简单的规则引擎

👏作者简介:大家好,我是爱吃芝士的土豆倪,24届校招生Java选手,很高兴认识大家📕系列专栏:Spring原理、JUC原理、Kafka原理、分布式技术原理、数据库技术🔥如果感觉博主的文章还不错的…

史诗级长文--朴素贝叶斯

引言 朴素贝叶斯算法是有监督的学习算法,解决的是分类问题,如客户是否流失、是否值得投资、信用等级评定等多分类问题。该算法的优点在于简单易懂、学习效率高、在某些领域的分类问题中能够与决策树、神经网络相媲美。但由于该算法以自变量之间的独立&am…

VC++中使用OpenCV读取图像、读取本地视频、读取摄像头并实时显示

VC中使用OpenCV读取图像、读取本地视频、读取摄像头并实时显示 最近闲着跟着油管博主murtazahassan,学习了一下LEARN OPENCV C in 4 HOURS | Including 3x Projects | Computer Vision,对应的Github源代码地址为:Learn-OpenCV-cpp-in-4-Hour…

Java重修第五天—面向对象3

通过学习本篇文章可以掌握如下知识 1、多态; 2、抽象类; 3、接口。 之前已经学过了继承,static等基础知识,这篇文章我们就开始深入了解面向对象多态、抽象类和接口的学习。 多态 多态是在继承/实现情况下的一种现象&#xf…

STM32 定时器输入捕获2——捕获高电平时长

由上图我们可以知道,高电平时间t2-t1。在代码中,可以记录此时t1的时间然后再记录t2的时间,t2-t1,就是我们所想要的答案。 但是,还有更简单一点点的,当到达t1的时候,我们把定时器清零&#xff0c…

Edge浏览器入门

关于作者: CSDN内容合伙人、技术专家, 从零开始做日活千万级APP,带领团队单日营收超千万。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业化变现、人工智能等,希望大家多多支持。 目录 一、导读二、概览…

【C++11】Lambda 表达式

Lambda表达式简介 Lambda 表达式是 C11 中语法之一Lambda 表达式把函数看作对象,把这个表达式当做对象使用Lambda 表达式可以赋值给变量,也可以当做参数传给真正的函数 Lambda表达式语法解析 [capture-list] (parameters) mutable -> return-type {…