Web安全测试学习笔记 - SQL注入防御
2023-02-18 16:42:06 时间
预防sql注入最好的方法是预编译。
用java做实验。没有使用预编译的代码:
Statement statement = con.createStatement(); String sql = "select * from users where username = '" + username + "'"; logger.info(sql); ResultSet rs = statement.executeQuery(sql);
使用sql注入,注入成功:
以下是mysql日志:
使用预编译的代码:
String sql = "select * from users where username = ?"; PreparedStatement st = con.prepareStatement(sql); st.setString(1, username);
使用sql注入,注入失败:
预编译的mysql日志,可以看到使用预编译之后,对特殊字符进行了转义:
Mybatis在传参的时候,#{}会进行预编译,而${}则不会。
下面是使用${}传参:
@Select("select * from users where username = '${username}'")
List<User> findByUserNameVuln01(@Param("username") String username);
注入成功:
日志如下
接下来使用#{}传参:
@Select("select * from users where username = #{username}")
User findByUserName(@Param("username") String username);
注入失败:
日志如下:
问过大佬们,预编译目前很难(几乎不可能)绕过,小小的一步就能抵御大大的风险,小伙伴们用起来~>_<~
相关文章
- EF DbContext.Configuration.ProxyCreationEnabled 什么鬼?
- 跌倒了,再爬起来:ASP.NET 5 Identity
- ASP.NET MVC中使用Unity Ioc Container
- 小菜学习Winform(一)贪吃蛇
- 解决 RabbitMQ 集群 Channel shutdown: connection error 错误(HAProxy 负载均衡)
- Spring Cloud Consul 实现服务注册和发现
- 坎坷路:ASP.NET 5 Identity 身份验证(上集)
- 塞翁失马,焉知非福:由 Styles.Render 所引发 runAllManagedModulesForAllRequests="true" 的思考
- DDD 领域驱动设计-三个问题思考实体和值对象
- 关于有默认值的字段在用EF做插入操作时的思考(续)
- Repository 仓储,你的归宿究竟在哪?(二)-这样的应用层代码,你能接受吗?
- DDD 领域驱动设计-Value Object(值对象)如何使用 EF 进行正确映射
- 醍醐灌顶:领域驱动设计实现之路
- DevExpress控件安装、汉化使用教程
- 小菜的程序员道路(三)
- RabbitMQ 消息顺序、消息幂等、消息重复、消息事务、集群
- DDD 领域驱动设计-如何控制业务流程?
- ASP.NET 5 Target framework dnx451 and dnxcore50
- 深入探讨:标签(Tag)的各种设计方案
- IDDD 实现领域驱动设计-一个简单的 CQRS 示例