V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wfdaj
V2EX  ›  PHP

请问,这里的值有必要过滤吗?

  •  
  •   wfdaj · 2022-05-11 13:35:04 +08:00 · 2012 次点击
    这是一个创建于 929 天前的主题,其中的信息可能已经有所发展或是发生改变。

    这里分配的 $user 做模板才用到,还需要过滤吗?

    return view('user/login', ['user' => $user]);
    

    源码:

    function view(string $path, array $data = []): string
    {
        $file = VIEW_PATH . $path . '.view.php';
    
        if (!file_exists($file)) {
            throw new Exception("模板文件 {$file} 不存在");
        }
    
        if ($data && is_array($data)) {
        	// 请问,这里的值有必要过滤吗?
            foreach ($data as $key => $value) {
                $data[$key] = escape($value);
            }
            extract($data, EXTR_SKIP);
        }
    
        ob_start();
        include $file;
        $contents = ob_get_contents() ?: '';
        ob_end_flush();
    
        return $contents;
    }
    

    还有,别人都这样用,为啥我这样是返回空字符?😅

    ob_start();
    
    try {
    	include($file);
    } catch (\Throwable $th) {
    	trigger_error($th);
    }
    
    return ob_get_clean();
    
    6 条回复    2022-05-11 16:15:35 +08:00
    alvinbone88
        1
    alvinbone88  
       2022-05-11 14:02:04 +08:00
    当然需要过滤,漏个引号没过滤就足够注入了
    看看你的 include ,和别人的是一个东西吗
    westoy
        2
    westoy  
       2022-05-11 14:05:57 +08:00
    首先 path 需要过滤, 不然可能会构造出包含漏洞

    foreach 那段不需要提早过滤, sql 用参数绑定,like 之后的做二次过滤,xss 在输出的时候过滤

    extract 那个我看见就害怕了........早年 gpc 漏洞之王啊, 敢手动制造 gpc 的都是猛人啊......
    vishun
        3
    vishun  
       2022-05-11 14:34:35 +08:00
    如果前端有用模板的话,类似 laravel 的 Blade ,直接{{}}就是纯文本展示,这种情况下就不需要过滤了。
    或者可以参考 yii2 的[防止 XSS 攻击]( https://www.yiiframework.com/doc/guide/2.0/zh-cn/security-best-practices#fang-zhi-xss-gong-ji)。
    IceBay
        4
    IceBay  
       2022-05-11 14:50:08 +08:00
    ob_start();
    include $path;
    $str = ob_get_contents();
    ob_end_clean();
    return $str;
    wfdaj
        5
    wfdaj  
    OP
       2022-05-11 15:11:40 +08:00
    唉,比较安全的做法肯定是用框架了。
    可是都没有喜欢的咋办?😅
    Laravel 肯定是首选,可刚安装完就 26 M 啊!
    我只想写个留言本用来学习啊!😂
    yekern
        6
    yekern  
       2022-05-11 16:15:35 +08:00
    可以试试 php 有的小型的迷你框架 Slim 根据自己的需求安装组件
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3398 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 11:57 · PVG 19:57 · LAX 03:57 · JFK 06:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.