说到安全,做网站的都知道,如果你的网站不安全,当被黑的时候会给公司带来巨大的损失,给用户带来不可靠的感受,流失用户。而且越是有名气的公司,越容易被黑。
比如下面的秘密后台被黑。
![秘密后台被黑](http://box.kancloud.cn/2015-08-09_55c6dcf813389.png)
再有索尼play station服务被黑等等。
是什么原因导致的呢?
**我们轻易相信了用户提交的数据。**
虽然,我们嘴上说,世界上好人总比坏人多,我们小网站,黑客看不上。不用做什么安全防范。但是心里明白:**永远不要相信用户输入**。
那么,我们如何增强网站安全性防护呢?
我们还是先了解一下web安全攻击的方式和防范的手段。
web应用安全分为两大块,代码安全性和服务器安全防范
# 代码安全性
## js XSS Cross Site Script 跨站脚本攻击
### 原理
利用存入的 未做特殊的html标签被网站显示时当成网页自身脚本执行了的特性来执行黑客的非法代码。
最新的ThinkPHP里的I函数默认用htmlspecialchars转义了特殊标签。
我们看一个简单的例子:
![2015-08-09/55c6fe76e8910](http://box.kancloud.cn/2015-08-09_55c6fe76e8910.png)
![2015-08-09/55c6fe8d6966c](http://box.kancloud.cn/2015-08-09_55c6fe8d6966c.png)
发布时 我动态当type 为0 的时候,就不过滤,为1的时候过滤。
因此,我以同样的内容不同类型发布两篇文章时。
存入数据库的内容字符不一样:
![2015-08-09/55c6feddeda95](http://box.kancloud.cn/2015-08-09_55c6feddeda95.png)
过滤过的正常显示:
![2015-08-09/55c6fef2eb63c](http://box.kancloud.cn/2015-08-09_55c6fef2eb63c.png)
未过滤的就执行script标签了:
![2015-08-09/55c6ff2577a4c](http://box.kancloud.cn/2015-08-09_55c6ff2577a4c.png)
高级点的黑客,xss 就不是给你恶作剧那么简单了。比如盗号:
![2015-08-09/55c700f622629](http://box.kancloud.cn/2015-08-09_55c700f622629.png)
![2015-08-09/55c70109b7647](http://box.kancloud.cn/2015-08-09_55c70109b7647.png)
![2015-08-09/55c7012d33a33](http://box.kancloud.cn/2015-08-09_55c7012d33a33.png)
上面的盗号过程我说明一下:黑客活跃于没有安全过滤的a网站,发了一篇钓鱼文章。写了一段js标签,将a网站上查看该帖时用户的的cookie信息传送到b.com也就是黑客自己的服务器网站上。然后黑客只要在a.com上用js设置cookie为非法收集到的某个c用户的cookie之后,刷新。登录身份就会变为c用户。如果网站安全性差一点,假c用户就会可能被操作现金、积分交易,恶意发帖再攻击其他人等。
### 防止XSS攻击的方
1.httponly
`session.cookie_httponly = On`
黑客不能盗取cookie了
但是还能破坏我们的网站:
~~~
<script>location=“http://b.com”; </script>
~~~
2.strip_tags 过滤HTML标签
![2015-08-09/55c702e3b26e2](http://box.kancloud.cn/2015-08-09_55c702e3b26e2.png)
3.htmlentities转义引号,第二个参数要设置为`ENT_QUOTES`
![2015-08-09/55c7033eb89f3](http://box.kancloud.cn/2015-08-09_55c7033eb89f3.png)
4.将反斜杠转义:`str_replace(‘\\’,‘\’)`
呵呵, 某些情况下,黑客还能执行JS代码
~~~
<a href="javascript:alert(1)"></a>
<div style="width:expression(alert(/xss/));"></div>
~~~
5.替换script,expression
`str_ireplace(array(‘script’,’ expression’),array(‘script’,’ expression’),str);`
注意:是替换,不是删除。
![2015-08-09/55c70438c0ac0](http://box.kancloud.cn/2015-08-09_55c70438c0ac0.png)
6.在登录程序处,强制重置session_id :session_regenerate_id(true)
PHP默认的session_id 始终为浏览器的PHPSESSID的cookie。 即使服务器端SESSION已经过期也一样。
用户的session_id 可能是百年不变。
7.最全的过滤方法
~~~
function filter($input){
$input = strip_tags(trim($input));
$input = htmlentities($input, ENT_QUOTES, 'UTF-8');
$input = str_ireplace(array('\\', 'script', 'expression'),
array('\', 'scrip t ', 'expressio n'),
$input
);
return $input;
}
~~~
8.使用markdown或UBB编辑器
##sql注入
### 方法
![2015-08-09/55c705f75c766](http://box.kancloud.cn/2015-08-09_55c705f75c766.png)
利用联合查询
![2015-08-09/55c706458f0f0](http://box.kancloud.cn/2015-08-09_55c706458f0f0.png)
查询mysql版本: 查询当前连接的数据库
`SELECT title,content FROM `article` WHERE `id`=‘-1’ union select database(),2 -- ’`
查询数据库结构:
`SELECT `title`,`content` FROM `article` WHERE `id`=‘-1’ union1, select (SELECT (@) FROM (SELECT(@:=0x00),(SELECT (@) FROM (information_schema.columns) WHERE (table_schema>=@) AND (@)IN (@:=CONCAT(@,0x0a,‘ [ ’,table_schema,‘ ] >’,table_name,‘ > ’,column_name))))x) --’`
查询用户名密码:
`SELECT title,content FROM `article` WHERE `id`=‘-1’ union select username,password from user-- ’`
万能登录密码:
`SELECT * FROM `user` WHERE `username`=‘admin’ -- ’ AND `password`=‘xxxx’`
更多攻击方法: http://websec.ca/kb/sql_injection
### 防止方法
1) 数字类型也要用单引号括起
2) 数字类型的值可以用 intval函数转换
3) 使用过滤函数
用mysql_real_escape_string 不用 mysql_escape_string
使用PDO时用:PDO::quote 或者 PDO::prepare
3) 设置好mysql用户权限,只允许操作指定的数据库
4) 表名加前缀,不要容易被猜出。
5) 用户密码不要用简单的md5加密。多种算法hash256,DES、md5 再加盐值 6) 变量在sql语句拼接是过滤。
`$sql = “SELECT * FROM `user` WHERE `id`=‘“.intval($id).”’”`
代码发布系统强制检查SQL语句的写法
7) 开发环境安装php-taint模块自动检测安全问题
**PHP_Taint** 和**SocketLog** 结合, 在开发时就能发现安全问题。有效的防止开发人员的粗心。
![2015-08-09/55c70723d2954](http://box.kancloud.cn/2015-08-09_55c70723d2954.png)
## iframe csrf 跨站请求伪造
### 原理
强制用户进行某操作
`<imgsrc=“/loginout.php”/> `
涉及用户权限的操纵最好用POST
![2015-08-09/55c707982c56a](http://box.kancloud.cn/2015-08-09_55c707982c56a.png)
自动提交表单的代码:
![2015-08-09/55c707b604c53](http://box.kancloud.cn/2015-08-09_55c707b604c53.png)
### 防范方法
1,判断来源,$_SERVER[‘HTTP_REFERER’]
2,验证码
显示表单时,显示验证码图片,并将验证码的值存到session。
提交表单后,程序判断用户输入的验证是否等于session的验证码值。
3,令牌验证。
原理和验证码类似。
显示表单时,生成一个隐藏域,值为随机字符串。并将值存到session。
提交表单后,程序判断提交的隐藏域值是否等于session中的值。
以上方式,能防止黑客刷真粉丝, 但是防不了刷僵尸粉。
![2015-08-09/55c70803e2c52](http://box.kancloud.cn/2015-08-09_55c70803e2c52.png)
# 服务器安全防范
## 上传文件的安全
黑客可以上传webshell修改网站程序文件,然后放置木马。
### 漏洞原因:
1,没有对上传文件的格式进行严格判断。
2,运行文件都漏洞,如果nginx和IIS7都出现过畸形解析的漏洞。
查找漏洞: 用find命令 查找最近被修改的文件, 再查看网站日志中文件修改时间时用 户再进行什么操作。
`find ./ -mtime 0: 查询最近24小时修改的文件`
### 预防方法:
程序文件的设置为只读。
上传文件和程序文件分离。(配置单独的二级域名访问,并不能执行PHP)
执行命令的安全
## include文件的安全
`include './class/'.$_GET['file']; -> ../../../../etc/passwd `
会泄露服务器账户信息。
防御方法:
1, include'./class/'. basename($_GET['file'].'.Class.php');
2, PHP 配置 open_basedir
## 可执行命令的安全
exec, shell_exec, system。 执行的命令如果有用户输入的命令,
用escapeshellcmd函数防止用户输入分号进行闭合命令。 用escapeshellarg函数防止用户闭合命令的参数。
配置 safe_mode_exec_dir ,让php只能执行指定目录下的命令程序
- 序
- 前言
- 内容简介
- 目录
- 基础知识
- 起步
- 控制器
- 模型
- 模板
- 命名空间
- 进阶知识
- 路由
- 配置
- 缓存
- 权限
- 扩展
- 国际化
- 安全
- 单元测试
- 拿来主义
- 调试方法
- 调试的步骤
- 调试工具
- 显示trace信息
- 开启调试和关闭调试的区别
- netbeans+xdebug
- Socketlog
- PHP常见错误
- 小黄鸭调试法,每个程序员都要知道的
- 应用场景
- 第三方登录
- 图片处理
- 博客
- SAE
- REST实践
- Cli
- ajax分页
- barcode条形码
- excel
- 发邮件
- 汉字转全拼和首字母,支持带声调
- 中文分词
- 浏览器useragent解析
- freelog项目实战
- 需求分析
- 数据库设计
- 编码实践
- 前端实现
- rest接口
- 文章发布
- 文件上传
- 视频播放
- 音乐播放
- 图片幻灯片展示
- 注册和登录
- 个人资料更新
- 第三方登录的使用
- 后台
- 微信的开发
- 首页及个人主页
- 列表
- 归档
- 搜索
- 分页
- 总结经验
- 自我提升
- 进行小项目的锻炼
- 对现有轮子的重构和移植
- 写技术博客
- 制作视频教程
- 学习PHP的知识和新特性
- 和同行直接沟通、交流
- 学好英语,走向国际
- 如何参与
- 浏览官网和极思维还有看云
- 回答ThinkPHP新手的问题
- 尝试发现ThinkPHP的bug,告诉官方人员或者push request
- 开发能提高效率的ThinkPHP工具
- 尝试翻译官方文档
- 帮新手入门
- 创造基于ThinkPHP的产品,进行连带推广
- 展望未来
- OneThink
- ThinkPHP4
- 附录