• PHP的安全性问题,你能说得上几个?


    一、SQL注入

    所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。比如先前的很多影视网站泄露VIP会员密码大多就是通过WEB表单递交查询字符暴出的,这类表单特别容易受到SQL注入式攻击.

    例如:

    <form action="sqlzhuru.php" method="post">
    <input type="text" name="uid" />
    <input type="submit" value="提交" />
    </form>
    sqlzhuru.php
    <?php
    include("../DB.class.php");
    $db = new DB();
    $uid = $_POST["uid"];
    $sql = "select * from users where uid = '{$uid}'";
    echo $sql;
    var_dump($db->Query($sql));

    这样就可以查到所有信息,解决方法:

    1. 手动检查每一条数据是否为正确的数据类型,自己写一个方法来过滤提交数据

    2.系统自带的一个方法:mysql_real_escape_string()过滤数据,但该方法在未来版本会淘汰

    <?php
    include("../DB.class.php");
    $db = new DB();
    $uid = $_POST["uid"];
    $uid = mysql_real_escape_string($uid); //系统自带过滤方法,但已经过时了
    $sql = "select * from users where uid = '{$uid}'";
    echo $sql;
    var_dump($db->Query($sql));

    3.使用PDO预处理

    二、XSS攻击

    跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的特殊目的。

    例如:

    <form action="xssgongji.php" method="post">
    <input type="text" name="test" />
    <input type="submit" value="提交" />
    </form>

    处理页面

    <?php
    include("../DB.class.php");
    $db = new DB();
    echo $_POST["test"];

    若用IE浏览器打开test页面:

    因为IE没有过滤方法,会弹出弹窗,而像谷歌、火狐、360等浏览器会屏蔽掉,不会弹出弹窗。

    解决方法:

    1.自己写一个方法屏蔽xss攻击,过滤字符串

    2.系统自带方法解决

    <?php
    /**屏蔽xss攻击方法
     * @blog http://www.phpddt.com
     * @param $string
     * @param $low 安全别级低
     */
    function clean_xss(&$string, $low = False)
    {
        if (! is_array ( $string ))
        {
            $string = trim ( $string );
            $string = strip_tags ( $string );
            $string = htmlspecialchars ( $string );
            if ($low)
            {
                return True;
            }
            $string = str_replace ( array ('"', "\", "'", "/", "..", "../", "./", "//" ), '', $string );
            $no = '/%0[0-8bcef]/';
            $string = preg_replace ( $no, '', $string );
            $no = '/%1[0-9a-f]/';
            $string = preg_replace ( $no, '', $string );
            $no = '/[x00-x08x0Bx0Cx0E-x1Fx7F]+/S';
            $string = preg_replace ( $no, '', $string );
            return True;
        }
        $keys = array_keys ( $string );
        foreach ( $keys as $key )
        {
            clean_xss ( $string [$key] );
        }
    }
    //just a test
    $str = 'phpddt.com<meta http-equiv="refresh" content="0;">';
    clean_xss($str); //如果你把这个注释掉,你就知道xss攻击的厉害了
    echo $str;
    ?>

     三、CSRF攻击

    CSRF(Cross-site request forgery跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,并且攻击方式几乎相左。XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。

    例如:

    <?php
    session_start();
    $_SESSION["uid"] = "lisi";
    ?>
    <form action="csrfcl.php" method="get">
    <input type="text" name="qian" />
    <input type="submit" value="提交" />
    </form>

    处理页面:

    <?php
    session_start();
    include("../DB.class.php");
    $db = new DB();
    if(empty($_SESSION["uid"]))
    {
        echo "未登录";    
    }
    else
    {    $qian = $_GET["qian"];    
        $sql = "update login set account = account-{$qian} where username = '{$_SESSION['uid']}'";
        echo $sql;
        $db->Query($sql,1);    
    }

    打开csrf.php页面:

       

    这种get传值方式会在地址栏显示提交数据,在不关闭页面的情况下,再做一个页面,把地址复制进去

    <body>
    <img src="http://localhost/phpanquan/csrfcl.php?qian=100" />
    </body>

    这样请求这个页面,也会将数据库中数据改掉:

    而如果改成POST方式,可以减少这种情况,也可以在表单中用隐藏域多提交一条数据,例如:

    <?php
    session_start();
    $_SESSION["uid"] = "lisi";
    $str = md5($_SESSION["uid"]);
    ?>
    <form action="csrfcl.php" method="post">
    <input type="hidden" value="<?php echo $str ?>" name="xinxi" />
    <input type="text" name="qian" />
    <input type="submit" value="提交" />
    </form>

    处理页面:

    <?php
    session_start();
    include("../DB.class.php");
    $db = new DB();
    
    if(empty($_SESSION["uid"]))
    {
        echo "未登录";    
    }
    else
    {
        $uid =md5($_SESSION["uid"]);
        $str = $_POST["xinxi"];    
        if($uid == $str)
        {
            $qian = $_POST["qian"];    
            $sql = "update login set account = account-{$qian} where username = '{$_SESSION['uid']}'";
            echo $sql;
            $db->Query($sql,1);
        }
    }

    但是这种方式也不能完全避免CSRF攻击,即使用MD5加密,也还是有人可以解出来,最好的方法还是使用验证码。你不知道验证码是怎么生成的,就无法进行CSRF攻击。

    SQL注入只需过滤提交的字符串即可,XSS攻击用PDO预处理,CSRF攻击用验证码就可解决。

    有些黑客会伪造FILE数组上传,如何辨别:move_upload_file()可以判断是不是真实文件。

    以后做项目,有关安全性的地方一定要谨慎,千万不要轻易相信用户上传或提交的任何数据,一定要进行正确处理。

    https://mp.weixin.qq.com/s/QRQ5Jp8sZa2cFdIY-t897Q

  • 相关阅读:
    docker 001 简介
    Golang 学习笔记 003 标识符、变量和常量
    Golang 学习笔记 002 第一个 go 程序
    Golang 学习笔记 001 环境部署
    nginx配置url中带问号的rewrite跳转
    北京市图书馆免费入口
    编译安装Python3
    Python—进程、线程、协程
    Python—I/O多路复用
    Python—Socket
  • 原文地址:https://www.cnblogs.com/lxwphp/p/9802130.html
Copyright © 2020-2023  润新知