web安全三——跨站请求伪造攻击(Cross Site Request Forgery (CSRF)) -电脑资料

电脑资料 时间:2019-01-01 我要投稿
【www.unjs.com - 电脑资料】

   

CSRF就是跨站请求伪造攻击,你这可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义发送恶意请求,

web安全三——跨站请求伪造攻击(Cross Site Request Forgery (CSRF))

。CSRF能够做的事情包括:以你名义发送邮件,发消息,盗取你的账号,修改你的密码,甚至于购买商品,虚拟货币转账……造成的问题包括:个人隐私泄露以及财产安全。

    这里以修改您的密码介绍CSRF。

    一、先看看没有任何安全防御的代码。

   

</p><p>    <table  width="100%" style="border-collapse: collapse; width: 794px; height: 16px; margin: 0px !important; padding: 0px !important; border: 0px !important;"><tbody><tr><td  width="1%" style="line-height: 1.5; font-family: 'sans serif', tahoma, verdana, helvetica; vertical-align: baseline;">01</td><td  style="line-height: 1.5; font-family: 'sans serif', tahoma, verdana, helvetica; vertical-align: baseline;">
02
<?php
03
04
if (isset($_GET['Change'])) {
05
06
// Turn requests into variables
07
$pass_new = $_GET['password_new'];
08
$pass_conf = $_GET['password_conf'];
09
10
11
if (($pass_new == $pass_conf)){
12
$pass_new = mysql_real_escape_string($pass_new);
13
$pass_new = md5($pass_new);
14
15
$insert="UPDATE `users` SET password = '$pass_new' WHERE user = 'admin';";
16
$result=mysql_query($insert) or die('' );
17
18
echo "";
19
mysql_close();
20
}
21
22
else{
23
echo "";
24
}
25
26
}
27
?>

这段代码直接将新密码写进数据库,没有验证用户的旧密码,也没有对http引用进行确认,这样任何别的网站都可以用你cookies对你的帐户进行CSRF攻击。

    二、下面这段代码对http引用进行确认,然后再写数据库。

   

    01

<?php
02
03
if (isset($_GET['Change'])) {
04
05
// Checks the http referer header
06
if ( eregi ( "127.0.0.1", $_SERVER['HTTP_REFERER'] ) ){
07
08
// Turn requests into variables
09
$pass_new = $_GET['password_new'];
10
$pass_conf = $_GET['password_conf'];
11
12
if ($pass_new == $pass_conf){
13
$pass_new = mysql_real_escape_string($pass_new);
14
$pass_new = md5($pass_new);
15
16
$insert="UPDATE `users` SET password = '$pass_new' WHERE user = 'admin';";
17
$result=mysql_query($insert) or die('' );
18
19
echo "";
20
mysql_close();
21
}
22
23
else{
24
echo "";
25
}
26
27
}
28
29
}
30
?>

这段代码虽然确认了http引用,但是还是看着不爽是吧,

电脑资料

web安全三——跨站请求伪造攻击(Cross Site Request Forgery (CSRF))》(https://www.unjs.com)。

    三、下面这段代码就比较爽了。

    01

<?php
02
03
if (isset($_GET['Change'])) {
04
05
// Turn requests into variables
06
$pass_curr = $_GET['password_current'];
07
$pass_new = $_GET['password_new'];
08
$pass_conf = $_GET['password_conf'];
09
10
// Sanitise current password input
11
$pass_curr = stripslashes( $pass_curr );
12
$pass_curr = mysql_real_escape_string( $pass_curr );
13
$pass_curr = md5( $pass_curr );
14
15
// Check that the current password is correct
16
$qry = "SELECT password FROM `users` WHERE user='admin' AND password='$pass_curr';";
17
$result = mysql_query($qry) or die('' );
18
19
if (($pass_new == $pass_conf) && ( $result && mysql_num_rows( $result ) == 1 )){
20
$pass_new = mysql_real_escape_string($pass_new);
21
$pass_new = md5($pass_new);
22
23
$insert="UPDATE `users` SET password = '$pass_new' WHERE user = 'admin';";
24
$result=mysql_query($insert) or die('' );
25
26
echo "";
27
mysql_close();
28
}
29
30
else{
31
echo "";
32
}
33
34
}
35
?>

    ​

最新文章