CSRF防范策略研究

时间:2023-12-29 17:07:44

目录

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攻击,但是黑客要破解起来也比较困难。