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

2022-05-11 13:35:04 +08:00
 wfdaj

这里分配的 $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();
1844 次点击
所在节点    PHP
6 条回复
alvinbone88
2022-05-11 14:02:04 +08:00
当然需要过滤,漏个引号没过滤就足够注入了
看看你的 include ,和别人的是一个东西吗
westoy
2022-05-11 14:05:57 +08:00
首先 path 需要过滤, 不然可能会构造出包含漏洞

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

extract 那个我看见就害怕了........早年 gpc 漏洞之王啊, 敢手动制造 gpc 的都是猛人啊......
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
2022-05-11 14:50:08 +08:00
ob_start();
include $path;
$str = ob_get_contents();
ob_end_clean();
return $str;
wfdaj
2022-05-11 15:11:40 +08:00
唉,比较安全的做法肯定是用框架了。
可是都没有喜欢的咋办?😅
Laravel 肯定是首选,可刚安装完就 26 M 啊!
我只想写个留言本用来学习啊!😂
yekern
2022-05-11 16:15:35 +08:00
可以试试 php 有的小型的迷你框架 Slim 根据自己的需求安装组件

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/852174

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX