美文网首页
聊一聊php的安全防护

聊一聊php的安全防护

作者: 张清柏 | 来源:发表于2020-07-23 17:03 被阅读0次

    先说一下自己在项目中遇到过的安全问题

    • 数据弱类型引起的问题,类似 12=='12xagd' ;
    • mysql 查询遇到 mysql 隐式类型转换问题;
    • xss攻击 打开企业邮件,哎呦,弹出一个 helloword,原来是script入库了..._...
    • mysql 注入 SELECT COUNT(*) ASnumrowsFROM (表名as b) WHEREb.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);
    • 第三方扩展 细节官网地址
      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
    • 注意可写目录数量 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
    • 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
    • 安全部门 安全测试

    相关文章

      网友评论

          本文标题:聊一聊php的安全防护

          本文链接:https://www.haomeiwen.com/subject/mwshlktx.html