位置: 编程技术 - 正文

防御SQL注入的方法总结(防御sql注入的方法有哪几种)

编辑:rootadmin

推荐整理分享防御SQL注入的方法总结(防御sql注入的方法有哪几种),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:防御sql注入的方法有哪几种,防御sql注入的方法有哪几种,防sql注入最有效的方法是,防御sql注入手段,防御sql注入的方式,防御sql注入的方法,防御sql注入的方法有哪几种,防御sql注入的方法有哪几种,内容如对您有帮助,希望把文章链接给更多的朋友!

SQL 注入是一类危害极大的攻击形式。虽然危害很大,但是防御却远远没有XSS那么困难。

SQL 注入可以参见: 注入漏洞存在的原因,就是拼接 SQL 参数。也就是将用于输入的查询参数,直接拼接在 SQL 语句中,导致了SQL 注入漏洞。

1. 演示下经典的SQL注入

Notice: Undefined index: CMSdown in /data/webroot/gcms/lib/Api/Open/Article.php on line img////_da.png" alt="查看图片" />

我们看到:select id,no from user where id=2;

如果该语句是通过sql字符串拼接得到的,比如: String sql = "select id,no from user where id=" + id;

其中的 id 是一个用户输入的参数,那么,如果用户输入的是 2, 那么上面看到查到了一条数据,如果用户输入的是 2 or 1=1 进行sql注入攻击,

那么看到,上面的语句(select id,no from user where id=2 or 1=1;)将user表中的所有记录都查出来了。

这就是典型的sql注入。

再看一列:

Notice: Undefined index: CMSdown in /data/webroot/gcms/lib/Api/Open/Article.php on line img////_dcc8.png" alt="查看图片" />

我们看到通过 sql 注入能够直接将表 sqlinject 删除掉!可见其危害!

防御SQL注入的方法总结(防御sql注入的方法有哪几种)

2. sql 注入的原因

sql注入的原因,表面上说是因为 拼接字符串,构成sql语句,没有使用 sql语句预编译,绑定变量。

但是更深层次的原因是,将用户输入的字符串,当成了 “sql语句” 来执行。

比如上面的 String sql = "select id,no from user where id=" + id;

我们希望用户输入的 id 的值,仅仅作为一个字符串字面值,传入数据库执行,但是当输入了: 2 or 1=1 时,其中的 or 1=1 并没有作为 where id= 的字面值,而是作为了 sql语句 来执行的。所以其本质是将用户的输入的数据,作为了命令来执行。

3. sql注入的防御

1> 基本上大家都知道 采用sql语句预编译和绑定变量,是防御sql注入的最佳方法。但是其中的深层次原因就不见得都理解了。

如上所示,就是典型的采用 sql语句预编译和绑定变量 。为什么这样就可以防止sql 注入呢?

其原因就是:采用了PreparedStatement,就会将sql语句:"select id, no from user where id=&#;" 预先编译好,也就是SQL引擎会预先进行语法分析,产生语法树,生成执行计划,也就是说,后面你输入的参数,无论你输入的是什么,都不会影响该sql语句的语法结构了,因为语法分析已经完成了,而语法分析主要是分析sql命令,比如 select ,from ,where ,and, or ,order by 等等。所以即使你后面输入了这些sql命令,也不会被当成sql命令来执行了,因为这些sql命令的执行, 必须先的通过语法分析,生成执行计划,既然语法分析已经完成,已经预编译过了,那么后面输入的参数,是绝对不可能作为sql命令来执行的,只会被当做字符串字面值参数。所以sql语句预编译可以防御sql注入。

2> 但是不是所有场景都能够采用 sql语句预编译,有一些场景必须的采用 字符串拼接的方式,此时,我们严格检查参数的数据类型,还有可以使用一些安全函数,来方式sql注入。

比如 String sql = "select id,no from user where id=" + id;

在接收到用户输入的参数时,我们就严格检查 id,只能是int型。复杂情况可以使用正则表达式来判断。这样也是可以防止sql注入的。

安全函数的使用,比如:

ESAPI.encoder().encodeForSQL(codec, name)该函数会将 name 中包含的一些特殊字符进行编码,这样 sql 引擎就不会将name中的字符串当成sql命令来进行语法分析了。

注:

实际项目中,一般我们都是采用各种的框架,比如ibatis, hibernate,mybatis等等。他们一般也默认就是sql预编译的。对于ibatis/mybatis,如果使用的是 #{name}形式的,那么就是sql预编译,使用 ${name} 就不是sql预编译的。

标签: 防御sql注入的方法有哪几种

本文链接地址:https://www.jiuchutong.com/biancheng/347710.html 转载请保留说明!

上一篇:用户 gimoonet 登录失败。原因: 该帐户的密码必须更改(用户登陆login什么意思)

下一篇:数据库设计三大范式简析(数据库设计三大范式)

  • 税控盘开票软件访问数据库错误
  • 所得税费用的计提
  • 开专票了还能不能退款
  • 房地产开发企业资质证书
  • 房产公司售楼部装修费入什么会计科目
  • 纳税人的住房租金专项附加扣除标准有
  • 银行代扣的社保怎么查询
  • 滴滴代叫乘客有没有事
  • 企业纳税成本管理方案
  • 偶然所得个税怎么计算公式
  • 动漫产业增值税优惠政策
  • 融资发票是什么
  • 收到采购商品
  • 公司支付收益权转让怎么做账?
  • 申报财产租赁合同印花税是在什么情况下?
  • 诉讼管辖分为
  • 携税宝的费用可以全额抵扣吗
  • 特许权使用费个税计算公式
  • 分公司可以迁移到新公司吗
  • 权责发生制如何计算
  • 怎么核对银行存款余额和对账单余额
  • 收到投资款怎么做凭证
  • 冲减以前年度所得税费用
  • 当期亏损需要提企业所得税吗财务报表
  • 企业收到应收账款6要素哪个增加哪个减少
  • 公司处置车辆税金怎么算
  • 高价转让股份
  • 党费返还款怎么做分录
  • u盘如何进行杀毒
  • 研发费用计入什么科目符合资本化
  • win7系统里没有无线网络连接
  • mac设置邮件
  • quicktimeplayer.exe - quicktimeplayer是什么进程 有什么用
  • windows 10 版本 21h1
  • 待抵扣进项税额和待认证进项税额的区别
  • 金针菜的养殖方法和技术
  • 计提个体户经营所得税
  • 债券转换为普通债权
  • 纳税调整项目有一个其他调增金额是怎么组成的
  • phpstudy怎么配置php环境
  • 银行进账单和现金缴款单的区别
  • 企业收取租金的未开具发票的怎么计算税款
  • 文化事业建设费减免政策
  • CodeIgniter连贯操作的底层原理分析
  • IntersectionObserver 翻译
  • sftp命令大全
  • python 微信红包
  • 待抵扣进项税额和进项税额的区别
  • 视同销售的增值税怎么申报
  • 非企业指的是什么
  • 如何做进项税额转出处理
  • abs函数python怎么用
  • centos 安装dpkg
  • 水灾期间未生产怎么处理
  • mysql错误提示
  • 信用减值损失是什么项目
  • 建筑工程机械费用标准
  • 公司收到生育津贴不给员工
  • 财政拨款的事业单位工资
  • 国有独资企业董事会成员组成规定
  • 工会赞助费
  • 差旅费借记什么科目
  • 出口免税项目
  • sql查询生成器
  • freebsd10安装教程
  • win7小技巧
  • visio.exe是什么进程
  • xp系统桌面图标不见了,点什么都没用?
  • xp系统打不开电脑
  • rtvscn95.exe - rtvscn95是什么进程 有什么用
  • new folder.exe是什么
  • 炉石传说开发人员卡牌
  • perl ne
  • shell脚本学习指南
  • 使用nodejs实现简单的局域网聊天功能
  • 9月1日起陕西省房产契税新政
  • 施工企业建筑机械管理机构主要职责是负责建筑机械的
  • 地税局工作人员工资标准多少
  • 个体工商户税务注销流程及需要的资料
  • 对于批发企业和零售连锁企业的质量验收,错误的是( )
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设