Java 业务开发常见错误 100 例
朱晔
贝壳金服资深架构师
52944 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 48 讲
代码篇 (23讲)
Java 业务开发常见错误 100 例
15
15
1.0x
00:00/00:00
登录|注册

29 | 数据和代码:数据就是数据,代码就是代码

限制Cookie的HttpOnly属性
自定义Jackson反序列化器和序列化器
自定义HttpServletRequestWrapper实现参数转义
HTML转码
用户输入的数据被替换为JavaScript脚本
使用SecurityManager和AccessControlContext构建沙箱环境
使用SimpleBindings绑定参数
外部传入的数据和代码拼接在一起
使用“#{}”进行参数化处理
使用“?”作为参数占位符
参数化查询
影响范围
不返回数据的接口不存在注入问题
只可能发生于Http Get请求
FreeMarker模板引擎的HTML转义处理
联合查询注入
解决方式
根源
解决方式
原因
解决方式
认知误区
思考与讨论
XSS攻击
代码注入
SQL注入
数据和代码:数据就是数据,代码就是代码

该思维导图由 AI 生成,仅供参考

你好,我是朱晔。今天,我来和你聊聊数据和代码的问题。
正如这一讲标题“数据就是数据,代码就是代码”所说,Web 安全方面的很多漏洞,都是源自把数据当成了代码来执行,也就是注入类问题,比如:
客户端提供给服务端的查询值,是一个数据,会成为 SQL 查询的一部分。黑客通过修改这个值注入一些 SQL,来达到在服务端运行 SQL 的目的,相当于把查询条件的数据变为了查询代码。这种攻击方式,叫做 SQL 注入。
对于规则引擎,我们可能会用动态语言做一些计算,和 SQL 注入一样外部传入的数据只能当做数据使用,如果被黑客利用传入了代码,那么代码可能就会被动态执行。这种攻击方式,叫做代码注入。
对于用户注册、留言评论等功能,服务端会从客户端收集一些信息,本来用户名、邮箱这类信息是纯文本信息,但是黑客把信息替换为了 JavaScript 代码。那么,这些信息在页面呈现时,可能就相当于执行了 JavaScript 代码。甚至是,服务端可能把这样的代码,当作普通信息保存到了数据库。黑客通过构建 JavaScript 代码来实现修改页面呈现、盗取信息,甚至蠕虫攻击的方式,叫做 XSS(跨站脚本)攻击。
今天,我们就通过案例来看一下这三个问题,并了解下应对方式。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了Web安全中数据和代码的关键作用,以及相关的安全漏洞。作者指出,许多安全漏洞源自将数据误以为是代码来执行,如SQL注入、代码注入和XSS攻击。通过具体案例分析,读者可以更深入地了解这些问题,并学习到相应的解决方法。文章还介绍了SQL注入的危害,以及如何通过参数化查询来避免注入问题。总之,本文对于理解Web安全中的数据和代码问题,以及如何应对相关漏洞具有重要的参考价值。 此外,文章还提出了解决动态执行JavaScript代码导致注入漏洞的两种方法:一种是通过SimpleBindings来绑定参数初始化变量,避免直接拼接代码;另一种是使用SecurityManager配合AccessControlContext,构建一个脚本运行的沙箱环境,以确保代码执行的安全性。这些解决方法为读者提供了在实际应用中防范代码注入漏洞的有效途径。 总的来说,本文通过深入分析Web安全中的数据和代码问题,以及相关的安全漏洞,为读者提供了重要的参考价值。读者可以从中了解到安全漏洞的成因和危害,并学习到相应的解决方法,有助于提升对Web安全的认识和实践能力。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Java 业务开发常见错误 100 例》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(11)

  • 最新
  • 精选
  • Summer 空城
    老师,您好,请教一个问题,微服务中一个模块跟多个模块rpc交互的时候,参数比较多的情况下是把其他模块的pojo复制过来,还是提供一个jar存放多个模块交互的pojo,供多个模块引用么?这两种方式感觉都不太好,老师您遇到这种问题是怎样处理的呢,麻烦老师指点下,谢谢老师o(^o^)o

    作者回复: 一般而言,不会使用你提到的两种方式 把其他模块的pojo复制过来,复制粘贴显然不是推荐的方式;提供一个jar存放多个模块交互的pojo,不建议把多个模块交互的pojo混在一个jar中。 一般有2种做法: 1、如果技术栈统一,那么可以把微服务拆为API + 实现两个jar(模块),前者包含接口 + POJO,后者的服务类实现前者中的接口,服务的开发者把前者打包为API包提供给使用者即可,比如Spring Cloud的Feign可以接口可以共享出去为微服务API包加入私服 2、如果技术栈不统一,比如不是所有的使用者都使用Spring Cloud,那么或许提供API包不是最好的方式,这个时候可以升级为提供SDK,SDK内部既包含API定义也包含Client调用Server的实现(比如通过HttpClient来),这样微服务使用者不用局限于使用微服务服务端相同的协议

    2020-05-23
    27
  • Geek_299a34
    老师,对于mybatis,有没有只能使用${}而不能使用#{}的情况?由于#{}会给参数内容自动加上引号,会在有些需要表示字段名、表名的场景下,SQL将无法正常执行。如查询user表信息,根据id或age排序SELECT * FROM USER ORDER BY #{value} desc,value为id时,id会被错误添加引号而无法排序,这种情况可以把#{}换成${}吗?谢谢老师

    作者回复: 使用${},但自己做好入参的防注入检查,即order by的参数只能是固定的

    2020-08-05
    3
    5
  • 我叫郭小黑
    new FilePermission(Shell.class.getProtectionDomain().getPermissions().elements().nextElement().getName(),"read"), 这个Shell 引入不进来呢?

    作者回复: 源码都是可以直接运行的 下载我的源码试试

    2020-09-25
    2
    2
  • 13963865700
    对于xss攻击防范,ESAPI的建议是在前端根据变量所处的位置(html、js)采用不同的编码方式进行转义,前端的开发成本较高;文中提到的方式是在后端采用过滤器统一转义存储,可以一劳永逸。老师在实际生产项目中采用的是哪种方式,转义存储对输入内容进行了修改,会不会产生什么副作用?

    作者回复: 要从业务角度看输入的内容是不是没有可能有脚本或特殊符号,如果是这样的话转义没有什么问题的,实际项目中就是采用文中说的所有方式组合起来

    2020-05-23
    2
  • 老师,这些经验你是怎么积累起来的呀?上面的代码可以直接用于生产环境吗?
    2020-09-11
    5
  • 郑思雨
    找到一篇文章对于联合查询注入,讲的很明白 https://blog.csdn.net/weixin_42277564/article/details/80583959 关于FreeMarker HTML 转义处理可以参考这篇文章: https://www.iteye.com/blog/yshjava-1870320 感谢老师讲解了这么多实用的技巧,学到了很多。
    2020-12-23
    3
  • 往事随风,顺其自然
    沙箱环境目的是啥,为啥有检查权限?
    2020-08-21
    2
  • 饭粒
    收获颇多👍
    2021-10-18
    1
  • 迪米乌格斯
    老师您好,想请教一下, 目前的架构不都是前后端分离的吗? 后端只和前端进行交互, 前端传来的数据应该是能确认安全的吧?
    2021-05-26
    2
    1
  • ...
    这里应对xss攻击的解决方案,作者提供的方式为servlet-filter、以及json序列化改写,可以说是更全面更合理。我自己的实现与作者提供的是有差别的,我们自己的解决方案为,get方式的通过nginx配置关键字过滤、post与作者提供的方式是类似的,实际上这种解决方案是拼凑的、割裂的,我们应该参照作者提供的思路,调整下我们自己的方案,集成在一个项目内,可以以插件包的方式提供出去,最好能提供灵活的针对单个属性做xss过滤的配置,如此这就是一个比较好的解决方案,也是对自己能力的锻炼。感谢作者大佬!
    2023-01-03归属地:浙江
收起评论
显示
设置
留言
11
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部