• 专注于网站建设,网络推广,关键词优化,SEO优化,专业的网站建设开发团队!

叶景网络之SQL注入与安全学习笔记

2015-06-13 17:26:41   来源:叶景网络
    sql注入的漏洞 SQL injection 
    #---------------------------------------------
    例如:
    首先创建一个数据库: create database testsql;
    再创建一张用户表:
    create table user(
    id int primary key auto_increment,
    username varchar(64) unique not null,
    password varchar(64) not null,
    email varchar(64) not null);
    添加两条数据:
    insert into user(username,password,email) values('zhou','123','zhoushiyong8763@163.com');
    insert into user(username,password,email) values('admin','123','zhoushiyong8763@163.com');
    #-----------------------------------------------------
    select * from user where username='$username' and password='$password';
    #-----------------------------------------------------
    对如下语句代码分析:
    $sql="select * from user where username='zhou' and password='123'";
    sql控制台注入语句:
    $sql="select * from user where username='zhou' and password='123' or 1='1'";//万能密码
    万能密码:123' or 1='1
    #-----------------------------------------------------
    对如下语句代码分析:
    select * from user where username='dsfdsf' and password='123';//不会查询到结果
    sql控制台注入语句:
    select * from user where username='dsfdsf' union select * from user;/* and password='123';
    万能用户名:dsfdsf' union select * from user/*
    #-----------------------------------------------------
    数字注入
    #-----------------------------------------------------
    对于如下的sql语句:
    select * from user where username=$username and password=$password;//没有单引号
    mysql会当成数字来处理(数字注入)
    sql控制台注入语句:
    select * from user where username=456 and password=53132 union select * from user;
    万能密码:53132 union select * from user
    #-----------------------------------------------------
    sql控制台注入语句:
    select * from user where username=456 union select * from user/* and password=53132;
    万能用户名:456 union select * from user/*
    #-----------------------------------------------------
    注入的防范
    #-----------------------------------------------------
    在php.ini中配置magic_quotes_gpc设置为on,display_errors设置为Off,此时的:
    一、select * from user where username='$username' and password='$password';注入语句失效
    二、select * from user where username=$username and password=$password;仍然可以注入
    当magic_quotes_gpc设置为on后,所有的'加入\转义(但是可以用ASCII码来代替单引号96)
    sql控制台下:select char(96) from dual;//结果为单引号'
    但通常下我们没有权限去修改php.ini文件,那么我们只能用程序下手
    方案1.用密码比对
    思想:首先通过用户输入的用户名查询数据库,如果查询到这个用户对应的密码,则和用户提交的密码比对,相同则可以通过,否则,非法登录。
    //用密码比对的方法(防注入)相关代码如下:
    $sql="select password from user where username='$username'";
    $res=mysql_query($sql,$conn) or die("查询出错".mysql_error());
    if($row=mysql_fetch_array($res)){//取出密码
    //看用户是否存在
    if($row[0]==$password){
    echo '<script type="text/javascript">window.location.href="./ManageUsers.php";</script>';//跳转
    }else{
    echo "您输入密码有误,请重新<a href='./login.php'>登录</a>";
    }
    }else{
    echo "您输入的用户名有误,请重新<a href='./login.php'>登录</a>";
    }
    方案2.用pdo的PDO::prepare()预处理操作来防止sql的注入漏洞
    pdo(PHP Data Object)扩展,在php5中加入,使用不同的数据库使用相同的方法名,解决数据库连接不统一的问题
    首先:
    1.修改php.ini文件,开启pdo
    ;extension=php_pdo_mysql.dll(去掉前前面的分号)
    得用pdo方式接边数据库
    //使用PDO的方式来防止sql注入(可以不用前面的数据库连接)
    $sql="select * from user where username=? and password=?";
    //创建一个PDO对象
    $myPdo=new PDO("mysql:host=localhost;port=3306;dbname=testsql","root","");
    //设置编码
    $myPdo->exec("set names utf8");
    //预处理$sql
    $pdoStatment=$myPdo->prepare($sql);
    //把接收到的用户名和密码填入
    $pdoStatment->execute(array($username,$password));
    //取出结果
    $res=$pdoStatment->fetch();
    if(empty($res)){
    echo "您输入的用户名或密码有误,请重新<a href='./login.php'>登录</a>";
    }else{
    echo '<script type="text/javascript">window.location.href="./ManageUsers.php";</script>';
    }
    #-----------------------------------------------------
    搜索引擎的sql注入
    //=============================================================================
    用%(一个百分号)   __(两个下划线)可以攻击
    //防止攻击,对关键字进行过虑
    $keyword=addslashes($keyword);
    $keyword=str_replace("%","\%",$keyword);
    $keyword=str_replace("__","\__",$keyword);
    //---------------------------------------------------------------
    相应的php代码在此省略,如有需要请联系我!
叶景网络,网络推广,网站建设
特别推荐RECOMMEND
搜索引擎网站关键词seo优化的意义
视频推广怎么做
网站seo优化怎么做关键词排上首页?
SEO介绍什么叫搜索引擎网站关键词优化
seo优化怎样做提升关键词排名
热点图文Hot
没有加www域名打不开的解决方案 没有加www域名打不
叶景网络之CodeIgniter框架的学习 叶景网络之CodeIgni
叶景网络之Ajax学习笔记 叶景网络之Ajax学习
叶景网络之DIV+CSS学习笔记 叶景网络之DIV+CSS
关注排行RANKING
1

没有加www域名打不开的解决方案

没有加www域名打不开的解决方案 网站上线了,在做SEO时发现没带www的时候访问不了,是以前的域名绑定时没做好,这对se...

2

叶景网络之CodeIgniter框架的学习

叶景网络之CodeIgniter框架的学习 叶景网络(www cngxit com),致力于互联网品牌建设与网络营销,专业领域包括网站建...

3

叶景网络之Ajax学习笔记

叶景网络之Ajax学习笔记 叶景网络(www cngxit com),致力于互联网品牌建设与网络营销,专业领域包括网站建...

4

叶景网络之DIV+CSS学习笔记

叶景网络之DIV+CSS学习笔记 叶景网络(www cngxit com),致力于互联网品牌建设与网络营销,专业领域包括网站建设...

5

叶景网络之SQL注入与安全学习笔记

叶景网络之SQL注入与安全学习笔记 叶景网络(www cngxit com),致力于互联网品牌建设与网络营销,专业领域包括网站建...

6

叶景网络之Mysql常用命令学习笔记

叶景网络之Mysql常用命令学习笔记 叶景网络(www cngxit com),致力于互联网品牌建设与网络营销,专业领域包括网站建...

7

叶景网络之Mysql优化的学习笔记

叶景网络之Mysql优化的学习笔记 通俗地理解三个范式,对于数据库设计大有好处。 第一范式:1NF是对属性的原子性...

8

叶景网络之Gvim编辑器的学习笔记

叶景网络之Gvim编辑器的学习笔记 叶景网络(www cngxit com),致力于互联网品牌建设与网络营销,专业领域包括网...

9

叶景网络之memcached 学习笔记

叶景网络之memcached 学习笔记 memcached 是一个高效的分布式的内存对象系统,他可以支持把各种php的数据放入...