Java 核心技术面试精讲
杨晓峰
前 Oracle 首席工程师
124523 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 44 讲
Java 核心技术面试精讲
15
15
1.0x
00:00/00:00
登录|注册

第31讲 | 你了解Java应用开发中的注入攻击吗?

安全是软件开发领域永远的主题之一,随着新技术浪潮的兴起,安全的重要性愈发凸显出来,对于金融等行业,甚至可以说安全是企业的生命线。不论是移动设备、普通 PC、小型机,还是大规模分布式系统,以及各种主流操作系统,Java 作为软件开发的基础平台之一,可以说是无处不在,自然也就成为安全攻击的首要目标之一。
今天我要问你的问题是,你了解 Java 应用开发中的注入攻击吗?

典型回答

注入式(Inject)攻击是一类非常常见的攻击方式,其基本特征是程序允许攻击者将不可信的动态内容注入到程序中,并将其执行,这就可能完全改变最初预计的执行过程,产生恶意效果。
下面是几种主要的注入式攻击途径,原则上提供动态执行能力的语言特性,都需要提防发生注入攻击的可能。
首先,就是最常见的 SQL 注入攻击。一个典型的场景就是 Web 系统的用户登录功能,根据用户输入的用户名和密码,我们需要去后端数据库核实信息。
假设应用逻辑是,后端程序利用界面输入动态生成类似下面的 SQL,然后让 JDBC 执行。
Select * from use_info where username = “input_usr_name” and password = “input_pwd”
但是,如果我输入的 input_pwd 是类似下面的文本,
“ or “”=”
那么,拼接出的 SQL 字符串就变成了下面的条件,OR 的存在导致输入什么名字都是复合条件的。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Java 核心技术面试精讲》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(21)

  • 最新
  • 精选
  • 羊羊羊
    也不是很懂,根据自己的理解讲一下,部分可能是错误的。中间人攻击原理大概是用户在正常上网的时候,同网段的恶意用户对其进行欺骗。恶意用户向局域网广播:我是路由器,然后正常用户(电脑无防御)收到以后认为恶意用户就是路由器,然后向恶意用户发送数据包,恶意用户可以截获数据包,再向路由器发送正常用户的数据包,路由器将返回的数据包在给恶意用户,恶意用户在给正常用户,恶意用户就形成了中间人的效果,可以向返回的数据包注入html代码,达到劫持用户网站的效果,不过现在大部分的网站都是https且双向认证,比较难获取到用户发送数据包中的账号密码。

    作者回复: 不错,如果从Java API的角度看,也存在很多可能,即使是https,在连接没完整建立前,最初的通信并不是安全的,例如,过程中发生proxy authentication之类,其实还是http

    19
  • 苦行僧
    每次使用开源组件,经常关注使用版本修复的问题列表,其中的安全修复值得重点关注

    作者回复: 安全是永远不能忽视的主题

    12
  • 鸡肉饭饭
    杨老师,您好,被一个安全问题困扰许久。就是开发者是否能够通过一定的手段修改jdk中的String类,并将修改后的String类进行替换,对于这个问题,应当从哪里开始寻找答案?谢谢

    作者回复: 你是说,类似自己build一个jdk吗?但即使改写里面的方法也未必生效,因为有的方法是用的intrinsic的内部实现

    3
    8
  • 王建
    中间人攻击最容易理解的可能就是fiddler吧,他可以截获request重新组织request的数据,有个专业的攻击工具叫burp。
    11
  • 随心而至
    PreparedStatement又是如何防范sql注入的呢? preparedStatement = "SELECT * FROM users WHERE name = ?"; preparedStatement.setString(1, userName); 查询“ SELECT * FROM users where where name =?” 将被发送到数据库,数据库会对其进行编译,然后将替换setString中的userName。 如果数据库看到非法值,它将引发错误。 因此,'or'1'='1将被视为一个完整的字符串,而不是包含运算符or和=的语句, 也就是数据库将其视为值为 "' or '1'='1"的字符(虽然是个奇怪的字符串)。 总结就一句话,占位符只能存储给定类型的值,而不能存储任意SQL片段(你写片段,我也把你看成是整体,即该类型的特别输入,比如上面的"' or '1'='1"就被看成是一个特别的String) https://stackoverflow.com/questions/4333015/does-the-preparedstatement-avoid-sql-injection https://en.wikipedia.org/wiki/SQL_injection
    10
  • 爪哇夜未眠
    期待杨晓峰老师直播!
    10
  • wei
    String你懂双亲委派就知道,自己定义String是用不了的。
    3
  • 会网络的老鼠
    或者通过明文传输、存储,这些都存在暴露安全隐患的可能。 朗读者将 明文 读成 文明 难道只有我注意到么?
    3
  • 咖啡猫口里的咖啡猫🐱
    我来回答,,鸡肉饭饭的,,,数据存在immutable,mutable,两种,java没有原生immutable支持,string如果是new就是相对意义的immutable,java基本类型和string是有高效缓存池范围,OK?
    2
  • 亚林
    中间人攻击,现在https如果被中间人代理了,一般程序要检查https证书是否合法,Android就是在本地保存一份合法https证书去检查线上https是否合法,缺点就是每次https证书到期之前要升级一次客户端,还有就是抓包调试的时候需要去掉https证书检查,才能正常运行抓包。
    1
收起评论
显示
设置
留言
21
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部