- 时间:2022-05-26 00:32 编辑: 来源: 阅读:
- 扫一扫,手机访问
摘要:PHP开发中常见的安全问题详解和解决方法(如Sql注入、CSRF、Xss、CC等)
浅谈Php安全和防Sql注入,防止Xss攻击,防盗链,防CSRF
[b]前言:[/b]
首先,笔者不是web安全的专家,所以这不是web安全方面专家级文章,而是学习笔记、细心总结文章,里面有些是我们phper不易发现或者说不重视的东西。所以笔者写下来方便以后查阅。在大公司肯定有专门的web安全测试员,安全方面不是phper考虑的范围。但是作为一个phper对于安全知识是:“知道有这么一回事,编程时自然有所注意”。
[b]目录:
[/b]1、php一些安全配置
(1)关闭php提示错误功能
(2)关闭一些“坏功能”
(3)严格配置文件权限。
2、严格的数据验证,你的用户不全是“好”人
2.1为了确保程序的安全性,健壮性,数据验证应该包括内容。
2.2程序员容易漏掉point或者说需要注意的事项
3、防注入
3.1简单判断是否有注入漏洞以及原理
3.2常见的mysql注入语句
(1)不用用户名和密码
(2)在不输入密码的情况下,利用某用户
(3)猜解某用户密码
(4)插入数据时提权
(5)更新提权和插入提权同理
(6)恶意更新和删除
(7)union、join等
(8)通配符号%、_
(9)还有很多猜测表信息的注入sql
33防注入的一些方法
2.3.1 php可用于防注入的一些函数和注意事项。
2.3.2防注入字符优先级。
2.3.3防注入代码
(1)参数是数字直接用intval()函数
(2)对于非文本参数的过滤
(3)文本数据防注入代码。
(4)当然还有其他与addslashes、mysql_escape_string结合的代码。
4、防止xss攻击
4.1Xss攻击过程
4.2常见xss攻击地方
4.3防XSS方法
5、CSRF
5.1简单说明CSRF原理
5.2防范方法
6、防盗链
7、防拒CC攻击
[b]1、php一些安全配置[/b]
[b](1)关闭php提示错误功能[/b]
在php.ini 中把display_errors改成
[url=benwin.php?id= <?php echo $id; ?>]
[b](4)用得很多的img标签
[/b]
<img src="<?php echo $picPath; ?>" />
甚至一些文本中插入整个img标签并且用width、 height、css等隐藏的很隐蔽
[b](5)地址栏[/b]
总之,有输出数据的地方,更准确的说是有输出用户提交的数据的地方,都有可能是XSS攻击的地方。
[b]4.3防XSS方法[/b]
防xss方法其实和防注入很相似,都是一些过滤、代替、实体化等方法
(1)过滤或移除特殊的Html标签。
例如:< 、>、<,、> '、”、<script>、 <iframe> 、<,、>、"
(2)过滤触发JavaScript 事件的标签。例如 onload、onclick、onfocus、onblur、onmouseover等等。
(3)php一些相关函数,strip_tags()、htmlspecialchars()、htmlentities()等函数可以起作用
[b]5、CSRF[/b]
CSRF跨站请求伪造cross site request forgery。
[b]5.1简单说明CSRF原理[/b]
(1)A登录Site1(如现在网民常上的淘宝、微博、QQ等),产生一些信息,session、cookies等等,且一直保持没退出。
(2)A再登录Site2(如一些成人网等,至于怎么跑到Site2,多数是Site通过些手段,邮件欺骗等),打开site2的浏览器和打开site1的一样,否则无效
(3)Site2站中伪造了Site1的http请求(如修改密码,买东西,转账等),Site1的服务器误以为A在site1的正常操作(因为同浏览器且A还没登出),然后就运行了请求,那么csrf已成功操作。
csrf和xss很相似。xss也能伪造请求,csrf也能制造脚本。
伪造的请求可以很多方面,发邮件、改密码、返回用户信息、交易等等,所以相对与xss攻击来说csrf危害更严重。
[b]5.2防范方法。[/b]
对于phper
(1)严密操控执行入口
执行一些敏感操作比如改密码这些操作前判断请求来源,只有本站服务器发的请求才可以执行。判断方法可以判断ip来源。非本站服务器ip不会执行。
(2)本站有外链的话做些必要操作
一般site2的hacker会在site1(比如论坛里)里发欺骗连接,因为在site1诱骗的相关人员一般都登录site1了,满足csrf气体条件之一。
如当你点击QQ邮件里面的长外链时候,回跳转到一个页面提示“有风险”之类,这样不仅可以减低跳出率,一些不懂的人看到这样的提示,若不是非必要而是处于好奇点击的连接一般不会继续点击访问;还有是QQ邮件正文里的图片在加载内容时是不加载图片的,要点击“显示图片”按钮才显示图片,这里一个原因之一就是避免攻击。
当然对于用户体验来说这是不可取的,可以优化的是判断到一些网址(如QQ本身网址)是安全直接可以显示(不用提示),而可疑的才提示或禁止。
(3)防止csrf也可以用防xss的方法。
[b]6、防盗链[/b]
盗链问题增加服务器的负担。盗链就是盗链网站盗取被盗链网站资源来实现一些功能。盗链方面主要是图片、视频、以及其他资源下载文件。
方法:判断ip,只有本站服务器才能使用站点资源,否则不能使用。
代码:
(1)在Apache htaccess添加
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$ [NC]
RewriteCond %{HTTP_REFERER} !phpben.com [NC]
RewriteCond %{HTTP_REFERER} !google.com [NC]
RewriteCond %{HTTP_REFERER} !baidu.com [NC]
RewriteCond %{HTTP_REFERER} !zhuaxia.com [NC]
RewriteRule .(jpg|gif|png|bmp|swf|jpeg) /image/replace.gif [R,NC,L]
RewriteRule ^(.*)$ http:\/\/phpben.com\/image\/$1 [L]
这样,凡是不是phpben.com google.com baidu.com zhuaxia.com 域名请求的都返回replace.gif代替返回
[b]7、防CC攻击[/b]
CC攻击:是利用不断对网站发送连接请求致使形成拒绝服务的目的。
详细百度百科:http://baike.baidu.com/view/662394.htm
代码:
session_start();
$ll_nowtime = $timestamp ;
if (session_is_registered('ll_lasttime')){
$ll_lasttime = $_SESSION['ll_lasttime'];
$ll_times = $_SESSION['ll_times'] + 1;
$_SESSION['ll_times'] = $ll_times;
}else{
$ll_lasttime = $ll_nowtime;
$ll_times = 1;
$_SESSION['ll_times'] = $ll_times;
$_SESSION['ll_lasttime'] = $ll_lasttime;
}
if (($ll_nowtime - $ll_lasttime)<3){
if ($ll_times>=5){
header(sprintf("Location: %s",'http://127.0.0.1'));
exit;
}
}else{
$ll_times = 0;
$_SESSION['ll_lasttime'] = $ll_nowtime;
$_SESSION['ll_times'] = $ll_times;
}