【问题标题】:pdo fetchAll with htmlspecialchars - protect js injection带有 htmlspecialchars 的 pdo fetchAll - 保护 js 注入
【发布时间】:2020-08-08 16:39:51
【问题描述】:

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

我有一个 api 层,我在其中选择数据并返回 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.net/manual/en/filter.filters.sanitize.php。还有 strip_tags,如果你想允许有效标签的子集:php.net/manual/en/function.strip-tags.php
  • 如果您使用strip_tags,请务必小心。这将破坏科学公式和其他具有有效&lt; 和&gt; 符号的数据。

标签: javascript php jsrender htmlspecialchars


【解决方案1】:

它应该在它被渲染成 HTML 之前的地方被编码,因为你不是在 PHP 中而是在 JavaScript 中渲染它,所以你应该在那里(始终如一地)这样做。

(如果您改为在 PHP 端对其进行编码,则必须记住此文本 仅 用于显示,否则您将立即进行双重编码,因为例如,将其传递给另一个 API 方法。)

在 JSRender 中有 {{&gt;...}} 标记(而不是 {{:...}})。详情见其docs。

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

【讨论】:

    猜你喜欢
    • 2015-08-20
    • 2011-06-26
    • 1970-01-01
    • 2017-06-16
    • 2022-11-23
    • 2014-02-21
    • 1970-01-01
    • 2016-06-16
    • 1970-01-01
    相关资源
    最近更新 更多