【问题标题】:Safely retrieving data from POST or GET in django在 django 中安全地从 POST 或 GET 检索数据
【发布时间】:2013-08-20 20:23:53
【问题描述】:

我想知道从 Django 中的 POST 或 GET 变量中检索数据的最安全方法。有时我会使用通过 urls.py 中的 url 模式直接传递给视图函数的变量。我被告知(不确定)当我开始使用“r”模式时它们可以安全使用。但我不知道为什么会这样。

对于检索 POST 数据,我知道两个选项:

  1. 使用表单,Django 表单有一个cleaned data 函数,它应该使数据可以安全使用.....

  2. 使用request.POST.get('someval')。由于据我所知这些值没有被转义,它们是否可能不安全?其次,放置ur 符号是否使其安全,如果是,为什么?

【问题讨论】:

标签: python django security


【解决方案1】:

r 字符串前缀不会保留在字符串值中。 'a\\b'r'a\b' 是完全相同的字符串,只有一个反斜杠。 u 前缀确定字符串是包含字节还是 Unicode 字符。一般来说,Django 应用程序中的字符串应该是 Unicode 字符串,但 Python 会在必要时自动将字节转换为字符(如果使用非 ASCII 字符,这可能会崩溃)。

这些都不能确定字符串是否“安全”。

在表单上使用cleaned_data 存储意味着数据已针对与其关联的特定类型的字段进行了验证。如果您有一个电子邮件字段,那么cleaned_data 值肯定看起来像一个有效的电子邮件地址。如果您有纯文本字段,则 cleaned_data 可以是任何字符串。这些都不能保证字符串是“安全的”;输入验证通常是一件好事,也是一种有用的纵深防御,但它并不能使应用程序安全地防止注入。

据我所知,由于这些值没有被转义,它们是否可能不安全?

输入值永远不应该被转义,也永远不是“安全的”。转义不是输入处理阶段的工作;当您将值放入具有不同上下文的字符串时,您必须担心转义。

因此,当您创建包含字符串的 HTML 响应时,您会对该字符串进行 HTML 转义。 (但更好的是:使用自动为您转义的模板语言,例如 Django 的autoescape。)

当您创建一个包含字符串的 SQL 查询时,您会对该字符串进行 SQL 转义。 (但更好的是:使用参数化查询或 ORM,这样您就不必使用字符串变量创建查询。)

当您创建一个包含字符串的 JavaScript 变量赋值时,您会 JS 转义该字符串。 (但更好的是:在 DOM data- 属性中传递数据并从 JS 中读取,而不是使用内联代码。)

等等。有许多不同形式的转义,并且没有全局转义方案可以保护您免受可能的注入攻击的范围。所以让输入保持原样,在输出阶段转义,或者更好地使用现有的框架工具来避免显式转义。

【讨论】:

    猜你喜欢
    • 2020-11-14
    • 2012-06-25
    • 1970-01-01
    • 2013-09-16
    • 1970-01-01
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多