这里分配的 $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();
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 根据自己的需求安装组件
|