• CSRF防范策略研究


    目录

    0x1:检查网页的来源

    0x2:检查内置的隐藏变量

    0x3:用POST不用GET

    检查网页的来源应该怎么做呢?首先我们应该检查$_SERVER[“HTTP_REFERER”]的值与来源网页的网址是否一致,就可以判断是否遭受到CSRF攻击

    例如:

    form.html

    <html>

    <head>

    <title>提交参数</title>

    </head>

    <body onload=”document.form1.submit();”>

    <form action=http://localhost/show.php method=”post” name=”form1” id=”form1”>

    <input type=”hidden” name=”id” id=”id” value=”4” />

    <input type=”hidden” name=”delete” value=”1” />

    </form>

    </body>

    </html>

    show.php

    <?php

    //检查来源文件,来源文件必须是本域

    $source_page=”http://localhost/show.php”;

    //检查文件来源是否正确

    If(strncmp($_SERVER[“HTTP_REFERER”], $source_page, strlen($source_page))) //大于或者小于IF都为真

    {

    //清除$_POST变量

    unset($_POST);

    }

    Else

    {

    If(isset($_POST[“delete”])) //如果选中删除按钮

    {

    //执行文章删除代码

    }

    }

    ?>

    检查内置的隐藏域变量又该怎么做呢?

    例如:

    Form.html:

    <html>

    <head>

    <title>参数提交</title>

    </head>

    <body onload=”document.form1.submit();”>

    <form action=”http://localhost/show.php” method=”post” name=”form1” id=”form1”>

    <input type=”hidden” name=”id” id=”id” value=”4” />

    <input type=”hidden” name=”delete” value=”1” />

    </form>

    </body>

    </html>

    show.php:

    <?php

    //打开Session

    session_start();

    if(!isset($_SESSION[“token”])) //如果没用产生token

    {

    //产生独特的ID,并且使用MD5来编码

    $token=md5(uniqid(rand(),true));

    //创建Session变量

    $_SESSION[“token”]=$token;

    //检查是否相等

    If($_SESSION(“token”)!=$_POST[“token”])

    {

    //清除POST变量

    unset($_POST);

    }

    }

    ?>

    <html>

    <head>

    <title>参数&token提交</title>

    </head>

    <body>

    <form action=”http://localhost/show.php” method=”post”>

    <input type=”submit” name=”delete” id=”delete” value=”删除” />

    <input type=”hidden” name=”id” value=”<?php echo $_GET[“id”]?>” />

    <input type=”hidden” name=”token” value=”<?php echo $_SESSION[“token”];?>” />

    </form>

    </body>

    </html>

    使用POST不使用GET:

    一般情况,在传递表单字段时一定要使用POS方法,而不要使用GET方法,处理变量时也不要使用$_REQUEST数组。虽然使用POST方法不一定能够保证绝对不会受到CSRF攻击,但是黑客要破解起来也比较困难。

  • 相关阅读:
    Struts1防止重复提交
    Jquery真的不难
    原生Ajax 和Jq Ajax
    JAVA调用Oracle存储过程
    Oracle存储过程包含三部分:过程声明,执行过程部分,存储过程异常。
    回到基础:封装集合
    如何摆脱工具类
    泛型的古怪与优雅
    Spring MVC + Hibernate + Maven: Crud操作示例
    JDBC性能小贴
  • 原文地址:https://www.cnblogs.com/milantgh/p/3751057.html
Copyright © 2020-2023  润新知