热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

sql注入方式及如何有效避免

首先提及sql注入这个题目,也许大家会笑笑,觉得这是一件比较低级的攻击方式,但事实上,正是这种不屑,就可能会导致我们网站数据库服务器被攻击,甚至服务器权限都被提走,这种例子,以不鲜见。以下是我在写
首先提及sql注入这个题目,也许大家会笑笑,觉得这是一件比较低级的攻击方式,但事实上,正是这种不屑,就可能会导致我们网站数据库服务器被攻击,甚至服务器权限都被提走,这种例子,以不鲜见。以下是我在写ORM时sql注入这块,所研究的心得,分享给大家,有可能说的不对,还望大家指正。
 
先来看下这段sql
$query = 'SELECT * from user where name =" '.$name.' "';
这样的sql是我们经常有写的,
 
然后$name = ' ";delete from user where name="mini -- ";';
这里' 后面跟一个空格,其实没有,是wile看的更清楚些
 
如此,这就是是一个sql注入,先截断了我们定义好的"符号,自定义一个"使之于我们定义好的第一个"配对,这样后面的输入串,就非一个sql字符串了,就成功完成sql注入
 
这种截断引号的注入方式非常常见,当然引号包括单引号于双引号,注入者,必须要完成与sql语句的前一个引号,成功配对,才可能完成注入,这里所说的成功配置指的是,如果 我们这里
where name =" ' .$name. ' " 注入者,就必须只有用"号才能成功配对,截断本该是字符串的参数,
如果这块是 where name =' " .$name. " ' 单引号来标识的字符串,那么注入者,只可能用单引号来截断,完成注入
 
注意上面提到的sql语句,变量拼接语法所涉及到的单引号或双引号,这只是语法形式,拼接完成后,并不会保留
 
前面说到的是,截断引号方式的注入方法,还有一种是根本不需要截断引号就可以完成注入的方式,
比如说,如下sql 
 
 $query = 'SELECT * from '.$user.' where name ="zhangyan" ';
 
其中$user = 'user;delete from user where name="mini";--';
 
如此这个变量本来就不在一个字符串中,当然,注入时,不用引号配对来截断,直接;结束上一个sql然后写我们的注入sql语句就ok
 
所以,有效的避免sql注入,并不仅仅是在where条件后。
 
如何来有效的避免sql注入呢,
 
这里只说pdo,
 
 
1.首先pdo提供quote方法,来转义所有的输入的参数
 
但是使用quote方法需要注意的是,它认为所有输入的参数都是字符串形式输出,所以在拼接sql是,自定义的sql语句就不用在加上 字符串表示符了(单引号或者双引号) 比如说where name ='.$name 
直接如此就ok 。这里出现的单引号是为了拼接变量的语法形式,并不是字符串中的引号
 
2.第二种方式是使用prepare来于执行你的sql语句,之后再进行填充你的输入参数,以此来保证不会出现截断整体sql的行为,但并不是说sql语句就完全能够防止sql注入,比如如下
 
$prepareSql = 'SELECT * from '.$user.' where name =:name';
$sth = $dbh->prepare($prepareSql);
$sth->execute(array(':name' => 'zhangsan'));
 
这里的$user 还是和之前一样 $user = 'user;delete from user where name="mini";--';
 
这样在预执行的时候,sql注入就已经发生了,网上都说pdo能够防止sql注入,这完全是不对的说法,
 
其实是否能完全防止sql语句,在于你是怎样用 的,比如说,我们把所有的输入参数,都经过转义后,才拼接到sql语句中,如果是用prepare,我们把所有输入参数都放在execute中,而不是拼接在prepare时,如此就能有效的防范sql注入,
 
其实关于网上说pdo能够防止sql注入,这句话应该这样说,pdo能够提供给更好的方法来防止sql注入。
 
其他链接数据库方式,只要做好输入字段的转义工作,也一样能够有效的防止sql的注入
 
其实所谓字段的转义工作,在sql语句里面,可以参照于pdo的quote方法,吧所有输入字段都当做字符串的输出,并且对所有引号进行转义,这样就能有效的防止,sql语句的注入。
 
 
3.对整个sql语句进行直接转义。
 
也许你回这样想,直接对整个sql语句进行转义,这样就开发者就不用单独提出所输入的字段了,也许你没这样想过,但至少我这样想过,但是这种方式是不对的,如下
 
这里就不以脚本的形式表现了,直接是sql语句形式
SELECT * from user where name = /"zh/"angyan/"
 
如果是对整个sql语句进行直接转义,最终发送给mysql的就是这样一句sql。
 
可以执行下,就知道,失败。
因为第一次转义和第二次转义的",正好会完成引号的配对,这样后面的字符就不是一种字符串方式了,在此之前,sql语句已经被截断,也就是说这种方式,是不会解决sql注入的。
 
最后总结一句:想从根本上解决sql注入,其实在于开发者的个人意识,根本上说什么框架不能完美的解决这个问题,即使是从框架方法解决,开发者也必须要把输入数据按照框架的约定放在我特定的规则里面,才能完美的解决sql注入隐患。
 
 
 
 
 
 
 
 
 
 
 
 

 


推荐阅读
  • php连接mysql显示数据,php连接mysql数据库的算法思想
    本文目录一览:1、怎么用php显示mysql数据表数据 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • 如何在php中将mysql查询结果赋值给变量
    本文介绍了在php中将mysql查询结果赋值给变量的方法,包括从mysql表中查询count(学号)并赋值给一个变量,以及如何将sql中查询单条结果赋值给php页面的一个变量。同时还讨论了php调用mysql查询结果到变量的方法,并提供了示例代码。 ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
  • 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之六 || API项目整体搭建 6.1 仓储模式
    代码已上传Github+Gitee,文末有地址  书接上文:前几回文章中,我们花了三天的时间简单了解了下接口文档Swagger框架,已经完全解放了我们的以前的Word说明文档,并且可以在线进行调 ... [详细]
  • 浅解XXE与Portswigger Web Sec
    XXE与PortswiggerWebSec​相关链接:​博客园​安全脉搏​FreeBuf​XML的全称为XML外部实体注入,在学习的过程中发现有回显的XXE并不多,而 ... [详细]
  • PreparedStatement防止SQL注入
    添加数据:packagecom.hyc.study03;importcom.hyc.study02.utils.JDBCUtils;importjava.sql ... [详细]
  • 一、Struts2是一个基于MVC设计模式的Web应用框架在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts2优点1、实现 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
author-avatar
vuvhvuvh
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有