聊一下面试经常问的SQL注入

概念

一、什么是所谓的SQL注入呢?

以下解释来自百度百科:
  SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。

二、这些都是官方属于,程序员最直观的就是直接上实例代码

下边我就使用原始的Jdbc操作数据库来模拟SQL注入的请求
1、SQL注入查询所有的用户信息
此时有个方法是按照用户名查询当前用户信息,理想状态下是只查询一个钥匙用户名不存在则返回空值。

String sql = "select id,telephone,address from user where user_name = "+ userName;

解释:看着好像也没啥毛病吧。。要是此时我将userName这个参数值传入 siri or 1 = 1 呢??看出问题了吧,这样这条sql的where条件就恒真了。相当于select * from user请求后我就可以拿到表中所有数据了,是不是又有点慌了。。

2、SQL注入删除表

String sql = "select id,telephone,address from user where user_name = "+ userName;

解释:还是用上边的sql进行演示,加入我传入userName的值为siri ; DROP TABLE user ;看出问题了吧,加一个分号就可以完整的写入其他可以执行的语句,看似是查询用户,分号后边的语句才是重点!!这个前提是需要知道你操作的表,大多数用户表还是user吧。要是再来个drop database;被攻击了你可以直接跑路了。。是不是又又有点慌了。。

3、SQL注入执行数据库中的函数*

String sql = "select id,telephone,address from user where user_name = "+ userName;

解释:通过SQL注入也可以执行数据库内部的函数。如userName传入 siri union select 1,1, sysdate();使用union 需要保证字段数量和返回的一致。再传入个siri union select 1,1, verison();查询当前数据库版本号,再传入一个union select 1,1, (SELECT GROUP_CONCAT(schema_name) FROM information_schema.schemata) schemaName;直接给你把当前用户左右库查出来了,删库还不容易吗。。是不是又又又有点慌了。。

三、 如何防止sql注入

sql注入通过演示的案例可以看到非常危险,肯定有成熟的解决方案喽
1、代码层防止sql注入攻击的最佳方案就是sql预编译(用的最多的)

String sql = "select id,telephone,address from user where user_name = ?";

(1)hibernate和原始jdbc可使用占位符这样我们传进来的参数就会被当作是一个userName,所以就不会出现sql注入了。
(2)mybatis中使用#{userName}获取值可以有效防止sql注入,在MyBatis中,${xxx}这样格式的参数会直接参与SQL编译,从而不能避免注入攻击。但涉及到动态表名和列名时,只能使用${xxx}这样的参数格式。所以,这样的参数需要我们在代码中手工进行处理来防止注入。
【结论】在编写MyBatis的映射语句时,尽量采用#{xxx}这样的格式。若不得不使用${xxx}这样的参数,要手工地做好过滤工作,来防止SQL注入攻击。

2、规定数据长度,能在一定程度上防止sql注入
一般SQL注入语句占的字符都很长,我们可以限制可输入文本的输入长度,还可以在输入框中限制特殊字符。如 ` & $ 等等

3、限制数据库权限
查询、新增、删除数据、删除表、删除库等操作进行严格的用户权限划分,可以有效的减小sql注入带来的危害。尤其是删除表、删除库这样的操作一般登录用户不给予权限就ok。

以上三个使用比较多,还有一些其他的比较少用的操作,稍作了解即可

4、SQL中限制SQL同时执行语句条数

5、纯数字的输入框限制只能输入数字等,手机号、银行卡号等进行格式的校验

6、避免直接响应一些sql异常信息,sql发生异常后,自定义异常进行响应

在这里插入图片描述

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码厚炮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值