1.服务端进行CSRF防御
服务端的CSRF方式方法很多样,但总的思想都是一致的,就是在客户端页面增加伪随机数。
(1).Cookie Hashing(所有表单都包含同一个伪随机值):
这可能是最简单的解决方案了,因为攻击者不能获得第三方的Cookie(理论上),所以表单中的数据也就构造失败了
(2).验证码
这个方案的思路是:每次的用户提交都需要用户在表单中填写一个图片上的随机字符串,厄…这个方案可以完全解决CSRF,但个人觉得在易用性方面似乎不是太好,还有听闻是验证码图片的使用涉及了一个被称为MHTML的Bug,可能在某些版本的微软IE中受影响。
(3).One-Time Tokens(不同的表单包含一个不同的伪随机值)
在实现One-Time Tokens时,需要注意一点:就是“并行会话的兼容”。如果用户在一个站点上同时打开了两个不同的表单,CSRF保护措施不应该影响到他对任何表单的提交。考虑一下如果每次表单被装入时站点生成一个伪随机值来覆盖以前的伪随机值将会发生什么情况:用户只能成功地提交他最后打开的表单,因为所有其他的表单都含有非法的伪随机值。必须小心操作以确保CSRF保护措施不会影响选项卡式的浏览或者利用多个浏览器窗口浏览一个站点。
2.预防xss攻击
php防止XSS跨站脚本攻击的方法:是针对非法的HTML代码包括单双引号等,使用htmlspecialchars()函数 。
在使用htmlspecialchars()函数的时候注意第二个参数, 直接用htmlspecialchars($string) 的话,第二个参数默认是ENT_COMPAT,函数默认只是转化双引号(“), 不对单引号(‘)做转义
3.预防sql注入
1、php.ini 中把 safe_mode 打开
2、 safe_mode_gid = off
3、 关闭危险函数
disable_functions = chdir,chroot,dir,getcwd,opendir,readdir,scandir,fopen,unlink,delete,copy,mkdir, rmdir,rename,file,file_get_contents,fputs,fwrite,chgrp,chmod,chown
4、 关闭PHP版本信息在http头中的泄漏 expose_php = Off
5、 打开magic_quotes_gpc来防止SQL注入 magic_quotes_gpc = On 这个默认是关闭的,如果它打开后将自动把用户提交对sql的查询进行转换 比如把 ’ 转为 '等,这对防止sql注射有重大作用
6、错误信息控制 error_reporting = E_WARNING & E_ERROR 只显示警告以上
7、 错误日志 建议在关闭display_errors后能够把错误信息记录下来,便于查找服务器运行的原因
log_errors = On error_log = D:/usr/local/apache2/logs/php_error.log
8、if (!get_magic_quotes_gpc()) { lastname=addslashes(lastname = addslashes(lastname=addslashes(_POST[‘lastname’]); } else { $lastname =
$_POST[‘lastname’]; }
get_magic_quotes_gpc 过滤后不用 addslashes 以免重复过滤
<?phpfunction post_check( $post ) {if (!get_magic_quotes_gpc()) // 判断magic_quotes_gpc是否为打开 {$post = addslashes ( $post ); // 进行magic_quotes_gpc没有打开的情况对提交数据的过滤 } $post = str_replace ( "_" , "\_" , $post ); // 把 '_'过滤掉 $post = str_replace ( "%" , "\%" , $post ); // 把' % '过滤掉 $post = nl2br ( $post ); // 回车转换 $post = htmlspecialchars( $post ); // html标记转换 return $post ; } ?>
关于SQL注入,不得不说的是现在大多虚拟主机都会把magic_quotes_gpc选项打开,在这种情况下所有的客户端GET和POST的数据都会自动进行addslashes处理,所以此时对字符串值的SQL注入是不可行的,但要防止对数字值的SQL注入,如用intval()等函数进行处理
CSRF概念:CSRF跨站点请求伪造(Cross—Site Request Forgery),跟XSS攻击一样,存在巨大的危害性,你可以这样来理解:
攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作,比如以你的名义发送邮件、发消息,盗取你的账号,添加系统管理员,甚至于购买商品、虚拟货币转账等。 如下:其中Web A为存在CSRF漏洞的网站,Web B为攻击者构建的恶意网站,User C为Web A网站的合法用户。
php防止SQL注入攻击与XSS攻击的例子参考
在php中防止SQL注入攻击与XSS攻击的二个简单方法,感兴趣的朋友可以参考下,就跟随百分网小编一起去了解下吧,想了解更多相关信息请持续关注我们应届毕业生考试网!
本节内容:
SQL注入攻击与XSS攻击的防范方法
在php编程中,所有有打印的语句如echo,print等 在打印前都要使用htmlentities() 进行过滤,这样可以防止Xss。
注意,中文要写出htmlentitiess($name,ENT_NOQUOTES,GB2312)。
mysql_real_escape_string()
SQL语句中,如果有类似这样的写法:
复制代码 代码示例:
"select * from cdr where src =".$userId;
要修改为:
复制代码 代码示例:
$userId=mysql_real_escape_string($userId)
另外,有打印的语句如echo,print等 在打印前都要使用htmlentities() 进行过滤,这样可以防止Xss,注意,中文要写出htmlentities($name,ENT_NOQUOTES,GB2312) 。
【拓展阅读】
首先,来看下php中的sql注入攻击。
mysql_connect("localhost","root","123456")or die("数据库连接失败!");mysql_select_db("test1");$user=$_post['uid'];$pwd=$_POST['pass'];if(mysql_query("SELECT * from whereadmin= `username`='$user' or `password`='$pwd'"){echo "用户成功登陆..";} eles {echo "用户名或密码出错";}?>
以上代码用于检测用户名或密码是否正确,可是在一些恶意攻击者中提交一些敏感代码,后果可想而知。
post判断注入的方式有2种。
1、在form表单的文本框输入 “or‘1’=1"或者"and 1=1”
在查询数据库的语句就应该是:
SELECT admin from where login = `user`=''or‘1'=1' or `pass`=‘xxxx'
当然也不会出现什么错误,因为or在sql的语句中代表和,或的`意思。当然也会提示错误。
当时我们已经发现了可以执行SQL语句之后就可以查询当前表的所有信息。例如:正确的管理员账户和密码进行登录入侵。。
修复方式1:
使用javascript脚本过滤特殊字符(不推荐,指标不治本)
如果攻击者禁用了javascript还是可以进行SQL注入攻击。。
修复方式2:
使用mysql的自带函数进行过滤。
// 省略连接数据库等操作$user=mysql_real_escape_string($_POST['user']);mysql_query("select * from admin whrer `username`='$user'");?>
2、XSS攻击以及防范。
提交表单:
接收文件:
if(empty($_POST['sub'])){echo $_POST['test'];}
代码很简单,只是模拟了下使用场景。
如果觉得《PHP 预防CSRF XSS SQL注入攻击》对你有帮助,请点赞、收藏,并留下你的观点哦!