zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    HearthBuddy投降插件2019-11-01的使用
    正则表达式在线分析 regex online analyzer
    Tips to write better Conditionals in JavaScript
    The fileSyncDll.ps1 is not digitally signed. You cannot run this script on the current system.
    Cannot capture jmeter traffic in fiddler
    JMETER + POST + anti-forgery token
    input type color
    HearthBuddy修改系统时间
    What are all the possible values for HTTP “Content-Type” header?
    UDK性能优化
  • 原文地址:https://www.cnblogs.com/lxwphp/p/9802130.html
Copyright © 2011-2022 走看看