带有 htmlspecialchars 的 pdo fetchAll - 保护 js 注入

pdo fetchAll with htmlspecialchars - protect js injection

所以我的网站将允许用户将 <script>alert("hey");</script> 保存到基本上任何字段,然后当我呈现它时,它会显示警报,但它不应该。在阅读它时,听起来您应该在 select 和呈现数据时使用 htmlspecialchars。

我有一个 api 层,其中我 select 数据和 return json,然后使用 jsrender 渲染。

这是我的查询示例 api:

$return = ["list",[]];
$sql = "SELECT * FROM `News`;"
if ($stmt = $GLOBALS['mysqli']->prepare($sql)) {
        if ($stmt->execute($param)) {
            $list = $stmt->fetchAll(PDO::FETCH_ASSOC);
            $return["list"] = $list ;
        }
}

header('Content-Type: application/json');
echo json_encode( $return);

我的模板类似于:

<div class="card-header  py-1 px-2">
        {{:Comment}}
</div>

在我的 api 中,我应该把 htmlspecialchars 放在哪里?

它应该在渲染到 HTML 之前的地方进行编码,因为你不是在 PHP 中渲染它,而是在 JavaScript 中渲染它,你应该这样做那里(一直)。

(如果您改为在 PHP 端编码,您必须记住此文本 用于显示,否则您最终会得到双重编码,例如,将其传递给另一个 API 方法。)

在 JSRender 中有 {{>...}} 标签(而不是 {{:...}})。详情见其docs.

<div class="card-header  py-1 px-2">
        {{>Comment}}
</div>