zoukankan      html  css  js  c++  java
  • 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语句的结构和数据部分分开!

  • 相关阅读:
    Hackerrank--Emma and sum of products (FFT)
    Hdu 1402 (FFT)
    Hackerrank--Divisibility of Power(Math)
    Hackerrank--Stock Maximize(DP Practice)
    Codeforces 455B
    vim 简明教程(转自飘过的小牛)
    ACdream 1007 (快速幂)
    编写可维护的JS 02
    编写可维护的JS 01
    图片加载-从模糊到清晰
  • 原文地址:https://www.cnblogs.com/mrszhou/p/7613305.html
Copyright © 2011-2022 走看看