孤尽训练营打卡日记day24--系统安全规约

前言

        现在是大数据的时代,数据是非常重要的,一张照片就有可能泄漏了你的位置信息。在我们的系统中,安全一直是老生常谈的话题,怎么维护我们的系统安全,在我们日常开发中,怎么避免出现安全问题,我们跟着Joel老师继续学习系统安全规约。

权限控制之越权访问漏洞

越权访问(Broken Access Control,简称 BAC)

        是web程序中一种常见的漏洞,由于其存在范围广、危害大,被 OWASP 列为Web应用十大安全隐患第二名。

垂直越权访问:

        拥有了不属于他的系统权限,比如普通用户拥有了系统管理员的权限,b比如修改金额

水平越权访问:

        是一种“基于数据的访问控制”,设计缺陷引起的漏洞。由于服务器端在接收到请求数据进行操作时,没有判断数据的所属人,所属部门而导致的越权数据访问漏洞。访问了不属于他的数据,比如a用户访问到了b用户的权限

越权访问漏洞防范措施

  • 前后端同时对用户输入信息进行校验,双重验证机制
  • 调用功能前,验证用户是否有权限调用相关功能
  • 执行关键操作时必须验证用户身份,验证用户是否具备操作数据的权限
  • 直接对象引用的资源id要加密,防止攻击者枚举攻击id,敏感数据特殊化处理
  • 永远不要相信来自用户的输入,对于可控参数进行严格的检查与过滤

敏感数据处理规约

敏感数据处理:

特殊信息授权   => 特殊信息脱敏  => 特殊信息加密存取 => 特殊信息加密传输

信息脱敏

        是指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护。在涉及客户安全数据或者一些商业敏感数据的情况下,在不违反系统规则条件下,对真实数据进行改造并提供测试使用,如身份证号、手机号、卡号、客户等个人信息都需要进行数据脱敏

数据脱敏原则

  • 保持原有数据特征
  • 保持数据之间的一致性
  • 保持业务规则的关联性
  • 多次脱敏之间的数据一致性

SQL注入常用防御手段:

  • 过滤危险字符
  • 使用预编译语句 :JDBC、 PrepareStatement
  • 参数化查询:Hibernate、Mybatis
  • Mybatis框架SQL注入漏洞场景

使用 $ 直接拼接

        #{}是预编译处理,MyBatis在处理#{ }时,它会将sql中的#{ }替换为?,然后调用PreparedStatement的set方法来赋值,传入字符串后,会在值两边加上单引号

       ${} 是字符串替换,在处理是字符串替换,MyBatis在处理时,它会将sql中的{ }替换为变量的值,传入的数据不会加两边加上单引号。

select * 
from user
where id = ${id}

如果 id = 1 or 1=1 则

select * 
from user
where id = 1 or 1 =1

条件永真,所以应该使用 #

select * 
from user
where id = #{id}

模糊查询like后的参数$

select * 
from user
where name like '%${name}%'

name = ' or 1 =1 

select *
from user
where name like '%' or '1=1 %' 

正确写法

1、在代码里拼接 %%
name = "%" + "123" + "%"

select *
from user
where name like #{name}


2、使用concat
select *
from user
where name like concat('%',#{name},'%')

in 之后的参数$

        一样会因为拼接导致SQL永真,正确使用方法使用 foreach

order by 之后$ 同理

其他常见完全问题

XSS跨站点脚本攻击及其防御

        在连接中注入恶意代码

  • 输入过滤单引号,双引号,<>等
  • 编码转换:Html实体编码、JavaScript编码
  • Cookie安全策略:HttpOnly

重放攻击

        接口重复调用

  • 使用Sentinel 实现API防刷

锲而舍之朽木不舍,锲而不舍,金石可镂。

参考文档:Joel老师的ppt

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你想将 Vue 3 路由的导航方式改为使用 `el-dialog` 打开页面,你可以按照以下步骤进行操作: 1. 首先,在你的组件中添加一个 `el-dialog` 组件,并设置一个变量来控制对话框的显示与隐藏。例如: ```vue <template> <div> <el-button @click="openDialog">打开对话框</el-button> <el-dialog :visible.sync="dialogVisible" @close="closeDialog"> <router-view></router-view> </el-dialog> </div> </template> <script> export default { data() { return { dialogVisible: false } }, methods: { openDialog() { this.dialogVisible = true this.$router.push({ name: 'DialogComponent' }) // 或者使用其他方式导航到对话框组件 }, closeDialog() { this.dialogVisible = false this.$router.push({ name: 'HomeComponent' }) // 或者使用其他方式导航回主页组件 } } } </script> ``` 在这个例子中,我们使用了 `el-button` 组件来触发 `openDialog` 方法,将 `dialogVisible` 设置为 `true`,从而打开对话框。对话框的内容使用了 `router-view` 组件来展示。 通过设置 `:visible.sync` 来实现对话框的显示与隐藏,并通过 `@close` 事件来监听对话框的关闭操作。在 `openDialog` 方法中,我们通过 `$router.push()` 方法导航到对话框组件,`name` 属性对应路由配置中的组件名称。 2. 在你的路由配置文件中,将需要展示在对话框中的路由组件配置为相应的路由。例如: ```javascript import { createRouter, createWebHistory } from 'vue-router' import HomeComponent from '@/components/HomeComponent.vue' import DialogComponent from '@/components/DialogComponent.vue' const routes = [ { path: '/', name: 'HomeComponent', component: HomeComponent }, { path: '/dialog', name: 'DialogComponent', component: DialogComponent } ] const router = createRouter({ history: createWebHistory(), routes }) export default router ``` 在这个例子中,我们将 `HomeComponent` 和 `DialogComponent` 配置为不同路径的组件,并给它们分配了对应的名称。 现在,当你点击 "打开对话框" 按钮时,对话框将会打开,并加载 `DialogComponent` 组件。 希望这个解答对你有所帮助!如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值