先说一下自己在项目中遇到过的安全问题
- 数据弱类型引起的问题,类似 12=='12xagd' ;
- mysql 查询遇到 mysql 隐式类型转换问题;
- xss攻击 打开企业邮件,哎呦,弹出一个 helloword,原来是script入库了..._...
- mysql 注入
SELECT COUNT(*) AS
numrowsFROM (
表名as b) WHERE
b.
cateid= '1' AND SLEEP(5)
- 密码穷举
- 短信轰炸
- 流量攻击,服务器就down了
- csrf攻击,特别是投票的时候
.......不想掉头发想了。先这么多
正题
- 这两天读了一本书,php安全之道,零零碎碎的大概三天吧,如果是周六周天估计两天也读完了,今特总结一下分享给大家,希望对大家有所帮助
- 本书有60%的内容是大家都知道的,或者是很基础的,我们在工作中可以提前避免的。有30%的干货,大部分在工作中都有遇到或者特别处理过,5% 是一些无关的东西,自己想看就看吧。还有5%是重复,嗯,是的,重复。
- 里面有0.0000001%的感悟,我也写里面了。如果你觉得哪块有问题。。。呃。。。肯定不是我补充的
- 大概梳理了一下,主要在以下几个方面
- 服务部署问题,比如mysql,redis 帐号密码ip加密 限制,
- 权限问题,权限最小化
- 版本问题,老版本有漏洞
- php自身系统函数危险函数问题
- 项目问题,编码逻辑问题,主要是对数据的加密问题,数据录入加密,传输加密,密码,cookie
- 验证码问题,onece,ip
- 对请求和参数的校验过滤处理
ya ri ma shou! 嗯,这是日语
php 安全原则
对数据不可信原则
- 控制输入和输出
- 数据鉴权
最小化原则
- 权限最小化
- 暴露最小化
优雅的代码
- 代码的可读性
- 扩展性
- 健壮性
组件安全
安全基础
信息屏蔽
- 错误日志 线上通过log
- 防止版本号暴露 expose_php 开启的情况下会暴露
- 关闭全局变量 register_globals=on
访问限制
-
目录权限,open_basedir
-
远程访问控制,allow_url_fopen 可以访问ftp http
-
禁止远程包含你allow_url_include
-
cookie 配置 1http php.ini session.cookie_httponly =1 禁止前台显示cookie https session.cookie_secure =1;
-
cookie设置超时和使用范围
-
php的新变化:移出了一些不安全的行数,特别是对mysql函数的支持,;移出了对ereg函数的支持
-
declare(strict_types=1); 增加类型限制
-
随机数生成器
- random_int(min,max);
- random_byte(length);
弱数据类型安全
public function testString() { $a='pay'; $b=0; dd($a==$b);//true }
public function testString() { $a='12pay'; $b=12; dd($a==$b);//true }
$str = 'string'; var_dump($str['1']);//t // var_dump(in_array(0, array('s')));//true
-
弱数据类型的问题
-
整型超过php_int_max(用户提交数据长度限制)
$a=92233720368547758074444492233720368547758074222449223372036854775807422244; $b=92233720368547758074444492233720368547758074222449223372036854775807422241; dd($a===$b);
-
数组函数的严格模式
- array_search
- in_array
- 三个参数分别是 needle,hystack,strict
- 例子
public function testarray() { $a=['ab','cd']; var_dump(in_array(0,$a));//true }
-
eval函数
$str='mkdir("hhhh");'; $str=eval($str);
-
assert
-
变量符号的定义
$a='b';
$b='c';
$c=123;
var_dump($$$a);//123
- extract等全局变量的覆盖
$a=[
'name'=>'zs',
'name1'=>'zs1',
];
extract($a);
dd($name);//zs
- 重定向未校验地址,重定向到其他未授权页面,可以加跳转白名单解决
- 文件上传 判断类型,大小,限制上传头
- sql 避免暴露错误信息给用户
- sql 隐式转换,二次解码注入
- pdo和mysqli进行链接数据库
- 预编辑
- ssrf攻击 资源泄漏
- xss攻击 js脚本攻击
- xxe p145
以上的这些攻击都是对用户传过来的数据没有校验和转义,比如对邮箱没有校验,还有通过字符转义 %0 %25
- openssl ssl
- 目录权限问题
- 系统函数 exec(), system(), passthru(), shell_exec()
- 说明: passthru与system的区别,passthru直接将结果输出到游览器,不返回任何值,且其可以输出二进制,比如图像数据
- 方法二:反撇号
- 用popen()函数打开进程
- 浏览器跨域安全问题
- 同源策略
- 服务端跨域设置header头部
- 客户端jsonp实现跨域访问
- 设置cors白名单
- xss攻击
- 网页执行script
- 获取cookie
- 存储型xss
- htmlentities() 实体转化
- htmlspecialchars() 字符串转实体
- 标签过滤
- urlencode
- 数据类型抓换
- httponly 保护用户cookie
- cookie和ip绑定,即登录时记录用户ip
- 浏览器支持
- csrf攻击 是值用户在a站的登录有效期内,访问了b站点,b站点引诱用户对a站点发起访问,该访问可以是转账,发送邮件等操作
- 加token检验
- refer
- 令牌鉴权
- header头部增加auth属性
- 站点劫持
- 同源策略
- x-frame-option 选项选择是否在frame中显示
- 请求拆分问题
"x HTTP/1.1\r\n\r\nDELETE /private-api HTTP/1.1\r\n"
在发出请求时,服务器可能会直接将其写入路径,如下:
GET /private-api?q=x HTTP/1.1
DELETE /private-api
Authorization: server-secret-key
- 会话攻击 [session 安全问题]
- 单帐号登录,使用乐观锁实现
- 设置 delete_old_session
- 密码加密
- 每个用户使用单独的salt值对密码加密,然后md5
- 长度,字符越长,hash碰撞越小
- 常用 md5 sha1 password_hash crypt
- 密码定期更新
- 密码破解
- 穷举破解
- 验证码
- token
- 鉴权
- 次数限制
- 密码复杂度
- oauth 防止csrf攻击
- 穷举破解
- 数字签名
- 保证数据完整性,不被篡改
-
对称加密 明文+密钥
image.png
- 非对称加密
项目部署安全
-
单一入口
-
规范的目录结构
image.png
image.png -
注意可写目录数量 php可执行权限和目录
-
通过nginx指定哪些目录可以执行php文件
-
http 明文传输的风险
- 窃听 篡改 冒充风险
- http+ssl=https
-
盗链,盗用网站资源 refer,通过nginx实现白名单,制定那些网站可以
image.png -
内容安全,过滤敏感词
image.png -
越权访问,水平越权和垂直越权 ,对当前登录用户身份判断,rbac权限控制role base access control who what how
image.png
- rbac 归根到底,是对路由权限的控制
- 系统鉴权
- 系统隔离,内外网分离,跳板机,堡垒机访问资源,避免直接暴露在外网
- api+token 访问
- ip 白名单,如果只对合作方提供服务,可以通过增加白名单
- 对header头+ip进行验证
- oauth认证,通过第三方 授权 发放token给用户,用户拿着tocken去请求
- 防止接口重放
- 接口幂等https://blog.csdn.net/stpeace/article/details/81154437,比如,有则更新,没有则添加,不会对系统产生副作用
- 时间戳过期
- 使用nonce number onece,一次性的任意或非重复的随机数,如存入redis,每次再请求过来去集合里面查一下,如果存在则认为i非法
- 时间戳+nonce
业务逻辑安全
- 短信安全
- 短信轰炸
- nonce
- 失效日期
- 和手机号的关联关系
- 内容可控
- 对手机号遍历发送短信
- 解决方法
- 验证码
- ip+手机号检验
- 时效性,减少hash碰撞 ,如成功一次失效,失败三次删除
敏感信息泄漏,未加密 ,明文传输(用户名,密码,身份证,等敏感数据)
-
资源泄漏,错误信息暴露,json劫持 代码泄漏
-
人机识别,行为验证码 图片验证码,语音,短信,好友确认等
-
注册安全,被恶意注册或者遍历 查找手机号和用户名
-
注意错误信息提示,比如,手机号不存在,用户名不存在,密码错误,容易被遍历用户
-
找回密码 ,短信,邮件验证,时效性检测,加密token
-
修改密码 提交用户名+密码 +验证码+合法性校验
-
支付安全
-
支付金额篡改 数量限制
应用软件安全
- 指纹安全
-
最小权限
-
ip限制
-
目录控制
-
错误信息页面显示
-
密码加密安全 帐号 ip限制
-
sql 用户权限控制
-
数据备份 热备份 冷备份 增量备份 完整备份
制定安全规范
- 业务需求安全分析
- 编码过程安全 code review
- 安全部门 安全测试
网友评论