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<?php0304if (isset($_GET['Change'])) {0506// Turn requests into variables07$pass_new = $_GET['password_new'];08$pass_conf = $_GET['password_conf'];091011if (($pass_new == $pass_conf)){12$pass_new = mysql_real_escape_string($pass_new);13$pass_new = md5($pass_new);1415$insert="UPDATE `users` SET password = '$pass_new' WHERE user = 'admin';";16$result=mysql_query($insert) or die('' );1718echo "";19mysql_close();20}2122else{23echo "";24}2526}27?>这段代码直接将新密码写进数据库,没有验证用户的旧密码,也没有对http引用进行确认,这样任何别的网站都可以用你cookies对你的帐户进行CSRF攻击。
二、下面这段代码对http引用进行确认,然后再写数据库。
01
<?php0203if (isset($_GET['Change'])) {0405// Checks the http referer header06if ( eregi ( "127.0.0.1", $_SERVER['HTTP_REFERER'] ) ){0708// Turn requests into variables09$pass_new = $_GET['password_new'];10$pass_conf = $_GET['password_conf'];1112if ($pass_new == $pass_conf){13$pass_new = mysql_real_escape_string($pass_new);14$pass_new = md5($pass_new);1516$insert="UPDATE `users` SET password = '$pass_new' WHERE user = 'admin';";17$result=mysql_query($insert) or die('' );1819echo "";20mysql_close();21}2223else{24echo "";25}2627}2829}30?>这段代码虽然确认了http引用,但是还是看着不爽是吧,
电脑资料
《web安全三——跨站请求伪造攻击(Cross Site Request Forgery (CSRF))》(https://www.unjs.com)。三、下面这段代码就比较爽了。
01
<?php0203if (isset($_GET['Change'])) {0405// Turn requests into variables06$pass_curr = $_GET['password_current'];07$pass_new = $_GET['password_new'];08$pass_conf = $_GET['password_conf'];0910// Sanitise current password input11$pass_curr = stripslashes( $pass_curr );12$pass_curr = mysql_real_escape_string( $pass_curr );13$pass_curr = md5( $pass_curr );1415// Check that the current password is correct16$qry = "SELECT password FROM `users` WHERE user='admin' AND password='$pass_curr';";17$result = mysql_query($qry) or die('' );1819if (($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);2223$insert="UPDATE `users` SET password = '$pass_new' WHERE user = 'admin';";24$result=mysql_query($insert) or die('' );2526echo "";27mysql_close();28}2930else{31echo "";32}3334}35?>