• 技术文章 >后端开发 >php教程

    php中mysql如何防注入和一些防注入函数用法总结

    伊谢尔伦伊谢尔伦2019-02-22 15:12:04原创5190
    简单判断是否有注入漏洞以及原理。防注入的代码其实来来去去都是那些组合,然后根据自己程序代码变通,重要是知道其中原理,为什么过滤这些字符,字符有什么危害。

    sql语句如:select  *  from phpben where id = 1

    相关mysql视频教程推荐:《mysql教程

    1.mysql注入语句

    (1)不用用户名和密码

    //正常语句  
    $sql ="select * from phpben where user_name='admin' and pwd ='123'";  
    //在用户名框输入'or'='or'或 'or 1='1 然后sql如下  
    $sql ="select * from phpben where user_name=' 'or'='or'' and pwd ='' ";  
    $sql ="select * from phpben where user_name=' 'or 1='1' and pwd ='' ";

    (2)在不输入密码的情况下,利用某用户。

    //正常语句  
    $sql ="select * from phpben where user_name='$username' and pwd ='$pwd'";  
    //利用的用户名是benwin 则用户名框输入benwin'#  密码有无都可,则$sql变成  
    $sql ="select * from phpben where user_name=' benwin'#' and pwd ='$pwd'";

    这是因为mysql中其中的一个注悉是“#”,上面语句中#已经把后面的内容给注悉掉,所以密码可以不输入或任意输入。网上有些人介绍说用“/*”来注悉,笔者想提的是只有开始注悉没结束注悉“*/”时,mysql会报错,也不是说“/**/”不能注悉,而是这里很难添加上“*/”来结束注悉,还有“– ”也是可以注悉mysql 但要注意“–”后至少有一个空格也就是“– ”,当然防注入代码要把三种都考虑进来,值得一提的是很多防注入代码中没把“– ”考虑进防注入范围。

    (3)猜解某用户密码

    //正常语句  
    $sql ="select * from phpben.com where user_name='$username' and pwd ='$pwd'";  
    //在密码输入框中输入“benwin' and left(pwd,1)='p'#”,则$sql是  
    $sql ="select * from phpben.com where user_name=' benwin' and left(pwd,1)='p'#' and pwd ='$pwd'";

    (4)插入数据时提权

    //正常语句,等级为1  
    $sql = "insert into phpben.com (`user_name`,`pwd`,`level`) values(‘benwin','iampwd',1) ";  
    //通过修改密码字符串把语句变成  
    $sql = "insert into phpben.com (`user_name`,`pwd`,`level`) values(‘benwin','iampwd',5)#',1) ";  
    $sql = "insert into phpben.com (`user_name`,`pwd`,`level`) values(‘benwin','iampwd',5)--  ',1) ";这样就把一个权限为1的用户提权到等级5

    (5)恶意更新和删除

    //正常语句  
    $sql = "update phpben set `user_name` = ‘benwin' where id =1";  
    //注入后,恶意代码是“1 or id>0”  
    $sql = "update phpben set `user_name` = ‘benwin' where id =1 or id>0";  
    //正常语句  
    $sql = "update phpben set  `user_name` ='benwin' where id=1";  
    //注入后  
    $sql = "update phpben set  `user_name` ='benwin' where id>0#' where id=1";  
    $sql = "update phpben set  `user_name` ='benwin' where id>0-- ' where id=1";

    (6)猜测表信息的注入sql

    //正常语句  
    $sql ="select * from phpben1 where`user_name`='benwin'";  
    //猜表名,运行正常则说明存在phpben2表  
    $sql ="select * from phpben1 where`user_name`='benwin' and (select count(*) from phpben2 )>0#' ";  
    //猜表字段,运行正常则说明phpben2表中有字段colum1  
    $sql ="select * from phpben1 where`user_name`='benwin' and (select count(colum1) from phpben2 )>0#'";  
    //猜字段值  
    $sql ="select * from phpben1 where`user_name`='benwin' and left(pwd,1)='p'#''";

    2. 防注入的一些函数和注意事项

    (1)addslashes 和stripslashes

    Addslashes给这些 “'”、“””、“\”,“NULL” 添加斜杆“\'”、“\””、“\\”,“\NULL”, stripslashes则相反,这里要注意的是php.ini是否开启了magic_quotes_gpc=ON,开启若使用addslashes会出现重复。所以使用的时候要先get_magic_quotes_gpc()检查

    (2)mysql_escape_string()和mysql_ real _escape_string()

    mysql_real_escape_string 必须在(PHP 4 >= 4.3.0, PHP 5)的情况下才能使用。否则只能用 mysql_escape_string

    if (PHP_VERSION >= '4.3')  
    {  
    $string  =  mysql_real_escape_string($string);  
    }else  
    {  
    $string  =  mysql_escape_string($string );  
    }

    (3)字符代替函数和匹配函数
    str_replace() 、perg_replace()这些函数之所以也在这里提是因为这些函数可以用于过滤或替代一些敏感、致命的字符。

    以上就是php中mysql如何防注入和一些防注入函数用法总结的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:mysql php 一些
    上一篇:新手培养php一些良好的安全习惯:关闭错误提示和严格数据验证等 下一篇:php中ASCII码以及进制转换函数实例代码详解
    20期PHP线上班

    相关文章推荐

    • 【活动】充值PHP中文网VIP即送云服务器• php-fpm配置详解_php实例• 用PHP+MySQL搭建聊天室功能实例代码_php实例• php和数据库结合的一个简单的web实例 代码分析 (php初学者)_php实例• 想下载个论坛,哪种好?该如何解决• PHP 读取大文件时,怎样得到以回车换行的一行数据。该怎么解决
    1/1

    PHP中文网