原则上提供动态执行能力的语言特性,都需要提防发生注入攻击的可能。
1)SQL 注入攻击(输入校验,不允许输入标点符号等特殊字符,或者特定结构的输入、不用完全动态的 SQL,而是利用 PreparedStatement、数据库对查询、修改等权限进行了合理限制)
2)操作系统命令注入。Java 语言提供了类似 Runtime.exec(…) 的 API,可以用来执行特定命令,假设我们构建了一个应用,以输入文本作为参数“input_file_name;rm –rf /*”,这就有可能出现问题了
3)XML 注入攻击。Java 核心类库提供了全面的 XML 处理、转换等各种 API(XPATH)
Java安全机制:
1、运行时安全机制:类加载过程中,进行字节码验证;类加载器本身也可以对代码之间进行隔离;利用 SecurityManger 机制和相关的组件,限制代码的运行时行为能力;GC
2、Java 提供的安全框架 API,这是构建安全通信等应用的基础。例如:
加密、解密 API。
授权、鉴权 API。
安全通信相关的类库,比如基本 HTTPS 通信协议相关标准实现,如TLS 1.3;或者附属的类似证书撤销状态判断(OSCP)等协议实现
3、 就是 JDK 集成的各种安全工具:
keytool,这是个强大的工具,可以管理安全场景中不可或缺的秘钥、证书等,并且可以管理 Java 程序使用的 keystore 文件。jarsigner,用于对 jar 文件进行签名或者验证。
你想了解更多安全漏洞的信息,可以从通用安全漏洞库(CVE)等途径获取,其他常见安全问题:
Man-In-The-Middle(MITM)攻击:中间人攻击最容易理解的可能就是fiddler吧,他可以截获request重新组织request的数据,有个专业的攻击工具叫burp。(HTTPS、不要点击恶意链接或电子邮件)
DOS攻击:利用大量机器发送请求,将目标网站的带宽或者其他资源耗尽。利用哈希碰撞发起拒绝服务攻击(DOS,Denial-Of-Service attack):构造大量相同哈希值的数据,然后以 JSON 数据的形式发送给服务器端(防火墙)
阿里巴巴json的漏洞
在密码使用的场景中,比如用户注册/登录。
我使用 char[] 数组存储和验证密码,并在使用结束后,通过随机的字符覆盖掉 char[]。
如果使用 string 存储密码,由于它的不可变性,它的缺陷是会一直驻留在堆中,直到未来被垃圾回收。
SQL注入,IO流没有关闭,使用不安全Random,重定向Url合法性没做检验,上传文件前后端没做文件大小类型校验。通过反射方式访问私有方法。日志包含敏感信息,没有禁止除GET,POST以外的HTTP请求等等