【问题标题】:Should I save in db - user input as html encode?我应该保存在 db - 用户输入为 html 编码吗?
【发布时间】:2014-03-10 10:00:27
【问题描述】:

我们与同事就是否应该 htmlencode 用户输入然后将其保存到 db 发生冲突(而不是直接保存)

我还发现various answersDB 应该保存普通(!)输入。

为什么?因为 DB 应该知道< 中的用户长度为 1,< 中的 not 为 4

html编码应该在输出时进行。

但是:

话虽如此,我发现 Stackoverflow 没有遵循此规则。

当我在 SO 保存一个问题时,其中包含纯 < 它确实在预览窗格中显示(显然)<。但是当我提交问题时:它将内容提交为 json with html encode

Json.stringify 没有进行 html 编码

所以如果我输入输入:

并提交:

我看到(通过提琴手)它实际上发送了 html 编码值:

问题:

如你所见 - 我有点困惑。通用逻辑说 db 应该以 1:1 的比例保存任何用户类型。

应该在输出端进行消毒

【问题讨论】:

  • 问题是关于最佳实践,而不是基于意见......
  • 没有最佳实践,只有好的实践!
  • 显然反对者​​不知道我在说什么

标签: javascript html encoding fiddler html-encode


【解决方案1】:

您必须对发送到服务器的输入进行编码,否则服务器上的反跨站点脚本保护将阻止整个请求。但是,您在保存到数据库之前解码此输入。

另外,您在 POST 中看到的不一定是保存到数据库中的内容。

【讨论】:

  • Craig ,将 1:1 发送到 db ,然后 - 输出时 - sanitize + encode... 有什么问题(就 XSS 库而言)?我的意思是 - 为什么要在服务器上再次解码只是因为这一层..
  • 允许未编码的请求到服务器是完全危险的。对于您希望在提交中允许标记以确保这些字段和那些字段仅包含标记的时间(相对不频繁!),值得额外的步骤。此外,您通常不允许在 POST 中使用任何 HTML。通常它只是一个精心限制的标签白名单。所以无论如何你都会编码/解码。
  • 重要的是要认识到并非所有服务器都具有反 XSS 功能,同样重要的是要认识到如果您要依赖客户端编码,攻击者可以使用 Fiddler 简单地发送未编码的攻击字符串到服务器。
  • @ericlaw,我不建议依赖客户端编码!我同意那不安全。相反,我说你应该在服务器上阻止未编码的请求。
  • 我仍然看不到服务器上未编码的请求有什么问题(当要插入数据库时​​)。 db 应该保存数据。不是个人数据、可读数据或安全数据——而是数据。但是在输出时 - 我同意我应该这样做:“使这些数据在显示时不会受到伤害”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-28
  • 1970-01-01
  • 1970-01-01
  • 2010-09-09
  • 1970-01-01
相关资源
最近更新 更多