【问题标题】:Flask jsonify: how to escape charactersFlask jsonify:如何转义字符
【发布时间】:2014-12-09 00:06:50
【问题描述】:

我刚刚开始使用 Flask Web 框架。我目前正在编写一个端点,它返回很可能包含恶意 javascript 的 JSON 位。

例如:

@api.route("/tester")
def api_jobs_tester():
    return jsonify({
        "name": "<script>alert(1)</script>"
    })

在本例中,返回:

{
  "name": "<script>alert(1)</script>"
}

但是,理想情况下,我希望返回:

{
  "name": "&lt;script&gt;alert(1)&lt;/script&gt;"
}

当然,这很容易在每个值的基础上进行,只需:

return jsonify({
    "name": escape("<script>alert(1)</script>")
})

但是,我可能需要返回比这更复杂的 JSON 响应,其中我不一定事先知道 JSON 的结构。

我可能会扮演我自己的函数来遍历 JSON 树并转义所有字符串,但我更喜欢内置的方式来执行此操作。

使用 Flask 转义 JSON 响应中的值的最简单方法是什么?

【问题讨论】:

    标签: python json flask xss


    【解决方案1】:

    jsonify 函数没有转义选项。但是flask.json中有htmlsafe_dumps函数,你可以使用:

    from flask import json, jsonify
    
    return jsonify(**json.loads(json.htmlsafe_dumps(obj)))
    

    【讨论】:

    • htmlsafe_dumps 非常接近我想要的。但是,有几个问题:1)您的导入与您的代码不匹配 2)jsonify 无法包装 htmlsafe_dumps 3)htmlsafe_dumps 返回错误的内容类型。如果你能解决这些问题,我很乐意接受这个作为答案。
    • 抱歉,这是个小错误。现在它应该可以满足您的需求了。
    • 这修复了问题 1,但不能解决问题 2 或 3。return jsonify(json.htmlsafe_dumps(obj)) 会导致 ValueError,因为 json.htmlsafe_dumps 返回的是 unicode 字符串,而不是字典。
    • 现在它必须工作)我忘记了 jsonify 函数需要参数列表。所以现在我们首先从 unicode 字符串中获取 python 的字典,然后通过 ** 操作符将其分解。
    猜你喜欢
    • 2013-12-10
    • 1970-01-01
    • 1970-01-01
    • 2012-12-09
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    相关资源
    最近更新 更多