php安全之道的大略讲解和总结

2020-07-23 17:05:00 996 技术小虫有点萌
  • 这两天读了一本书,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);
  • 第三方扩展 细节官网地址 sohusin --加密,递归深度,函数禁用 taint 过滤用户提交过来的数据

弱数据类型安全

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
  • 非对称加密

项目部署安全

  • 单一入口

  • 规范的目录结构 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

image.png
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
  • 安全部门 安全测试