PHP:测试SQL注入以及防止SQL注入

在写登录注册的时候发现了SQL和JS注入这个危害网站的用户举动:

测试方法:

SQL注入:

1 先来做一个测试:
2 用户名:’ or 1 #
3 密码:随便写8位以上
4 验证码:写正确

好吧,就那么简单就进去了:

概念

如果用户在填写表单或者其他数据的时候,通过一些特殊的数据形式,对SQL的行为作出了非法的影响,就叫作SQL注入!

基本原理

正常执行的sql语句:

1 select * from bg_admin where admin_name=‘zhouyang‘ and admin_pass=md5(‘12345678‘)

不正常执行的sql语句:

1 select * from bg_admin where admin_name=‘‘ or 1 #‘ and admin_pass=md5(‘123654uiykgjfhdsav‘)

拆分分析:

由于#在sql语句中是注释符,所以,上面的SQL语句真正执行的是:

1 select * from bg_admin where admin_name=‘‘ or 1

很显然,上面执行的结果就是where后面的条件永远为真!其实就相当于:

1 select * from bg_admin

也就是说,只要bg_admin表中有正常的管理用户,就可以查询到数据!

其实,在这里可以进行sql注入的“用户名”还有很多,比如:

‘ or 1 or ‘

1 select * from bg_admin where admin_name=‘‘ or 1 or ‘‘ and admin_pass=md5(‘ewsdfgbnvb‘)

特别强调:

1,  不仅仅是在用户登录的时候,SQL语句可以被注入,其他任何用户的数据只要参与执行,都有可能被注入!

2,  SQL注入的危害非常之大,有时候甚至可以删除服务器上的整个数据库:

比如:

用户名为:‘ or 1;drop database php2010;#

注意:

MySQL数据库默认的有information_schema,所有数据库的名称等信息都存放在里面,这些数据库很容易获取到默认数据库的名字!

解决方案

1,  在业务逻辑上预防,比如要求用户名只能由特定的字符组成(比如数字字母下划线)(使用正则表达式)

2,  使用PHP函数addslashes(最常用)

其中:

strip_tags(trim($data)是防止JS注入的!!
1    /**
2      * 对用户的数据进行安全过滤
3      */
4     protected function escapeData($data) {
5         return addslashes(strip_tags(trim($data)));
6     } 

3,  使用MySQL提供的数据转义函数:mysql_real_escape_string($data, $link);不过有一个前提是必须连接上数据库之后才可以使用!

4,  使用预处理技术,因为预处理是强制将sql语句的结构和数据部分分开!

时间: 2024-10-18 05:50:28

PHP:测试SQL注入以及防止SQL注入的相关文章

『SQL注入』 User-Agent 手工注入的探测与利用分析

原理很简单:后台在接收UA时没有对UA做过滤,也没有PDO进行数据交互(实际PDO是非常有必要的),导致UA中有恶意代码,最终在数据库中执行. Bug 代码: 本地顺手打了一个环境,Bug 代码部分: // 保存到访者的IP信息 $db=DBConnect(); $tbLog=$db->tbPrefix.'log'; $executeArr=array('ip'=>($_SERVER["HTTP_VIA"])?$_SERVER["HTTP_X_FORWARDED_

使用sqlmap注入DVWA的SQL Injection菜单

1 使用sqlmap注入DVWA的SQL Injection菜单 本教程中的登陆地址:http://192.168.0.112/dvwa/login.php 1.1 获取cookie信息 1) 使用admin/password登陆系统,通过firebug工具获取cookie信息. 得到的cookie信息如下: security=low; path=/dvwa/; domain=192.168.0.112 PHPSESSID=0bec860709d15f590768b7713c69b52f; pa

【sql注入】浅谈sql注入中的Post注入

[sql注入]浅谈sql注入中的Post注入 本文来源:i春秋学院 00x01在许多交流群中,我看见很多朋友对于post注入很是迷茫,曾几何,我也是这样,因为我们都被复杂化了,想的太辅助了所以导致现在感觉到难,现在,就让我们一起来谈谈,post注入是多么的轻松吧!PS:文中有写os-shell00x02测试站点:http://xxx.xxxxx.com/对于我来说,post注入无非有两种方法第一种利用burp抓包然后使用sqlmap -r 来进行检测注入第二种比较简单,直接使用sqlmap --

Pikahu-SQL注入模块(Sql inject)(实验实战篇)

一,数字型注入: 看到界面后我们发现只能输入id(1-6),我们来试试: 测试注入时,我们需要思考提交的参数后台是如何操作的.我们提交了一个d,返回了用户名和邮箱.正常来说,我们的数据是放在数据库里的,当我们提交了这个id的,后台会带这个参数到数据库里查询. 因为是用POST语句取得我们传递的参数值,传递给一个变量,再到数据库查询.所以我们猜测后台的查询语句大概是下面这样 $id=$_POST[‘id‘] select 字段1,字段2 from 表名 where id=1$id 这里的id 就是

如何使用SQLAlchemy库写出防SQL注入的Raw SQL

Python阵营有很多操作数据库的开源库(安装pip后,可以借助"pip search mysql"查看可用的库列表),其中被使用最多的无疑是MySQLdb,这个库简单易上手.其偏底层的特性为开发者提供灵活性的同时,也对不少新手写出的DB操作代码提出了考验,因为它只支持raw sql,容易导致sql注入攻击. 鉴于此,很多库提供了ORM接口能力,借助OO思想,数据库中的表被映射为Python的类,类的对象代表数据表中的一行记录,所有的DB操作都通过对象方法调用来实现,这些调用在底层被自

C#使用带like的sql语句时防sql注入的方法

本文实例叙述了在拼接sql语句的时候,如果遇到Like的情况该怎么办. 一般采用带like的SQL语句进行简单的拼接字符串时,需要开率遇到sql注入的情况.这确实是个需要注意的问题. 这里结合一些查阅的资料做了初步的整理. 如这样一个sql语句: select * from game where gamename like '%张三%' 用c#表示的话: string keywords = "张三"; StringBuilder strSql=new StringBuilder();

SQL注入盲注——布尔注入

SQL注入盲注--布尔注入 原文地址:https://www.cnblogs.com/blogs-1024/p/11204272.html

DVWA(三):SQL injection 全等级SQL注入

(本文不定期更新) 一.所需环境: 1.DVWA 2.web环境 phpstudy/wamp 3.burp suite 二.SQL注入产生的原因: 程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患 用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据或进行数据库操作. 三.关于SQL注入需要注意的几个点: 1.SQL注入的攻击流程: (1)判断注入点:一般分为三大类 GET.POST参数触发SQL注入,Cookie触发注入 (2)判断注入类

Spring----内bean和集合属性注入和properties属性注入

内部bean bean里的属性可以赋空值 先初始化三个Car的bean <!-- 定义若干辆车 --> <bean id="car1" class="com.entity.Car"> <property name="brand" value="宝马"/> <property name="color" value="白色"/> </be

11g新特性-自动sql调优(Automatic SQL Tuning)

11g新特性-自动sql调优(Automatic SQL Tuning) 在Oracle 10g中,引进了自动sql调优特性.此外,ADDM也会监控捕获高负载的sql语句. 在Oracle 11g中,通过运行sql tuning advisor加强了自动sql调优功能.默认情况下是每天夜间通过自动任务的方式运行"自动sql调优". 自动sql调优的过程: 1.识别需要调优的sql语句  根据AWR中的CPU和I/O负载来识别 2.调优,生成新的sql profile 在维护窗口(mai