
这里分配的 $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 ne 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(); 1 alvinbone88 2022-05-11 14:02:04 +08:00 当然需要过滤,漏个引号没过滤就足够注入了 看看你的 include ,和别人的是一个东西吗 |
2 westoy 2022-05-11 14:05:57 +08:00 首先 path 需要过滤, 不然可能会构造出包含漏洞 foreach 那段不需要提早过滤, sql 用参数绑定,like 之后的做二次过滤,xss 在输出的时候过滤 extract 那个我看见就害怕了........早年 gpc 漏洞之王啊, 敢手动制造 gpc 的都是猛人啊...... |
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)。 |
4 icebay 2022-05-11 14:50:08 +08:00 ob_start(); include $path; $str = ob_get_contents(); ob_end_clean(); return $str; |
5 wfdaj OP 唉,比较安全的做法肯定是用框架了。 可是都没有喜欢的咋办? Laravel 肯定是首选,可刚安装完就 26 M 啊! 我只想写个留言本用来学习啊! |
6 yekern 2022-05-11 16:15:35 +08:00 可以试试 php 有的小型的迷你框架 Slim 根据自己的需求安装组件 |