以 text/html 内容类型发送登录凭据

Posted

技术标签:

【中文标题】以 text/html 内容类型发送登录凭据【英文标题】:Sending login credentials as text/html content type 【发布时间】:2017-03-26 07:27:27 【问题描述】:

我正在使用REST 服务进行登录身份验证,该服务期望我以text/html 发送凭据,并且如果我以application/x-www-form-urlencoded 内容类型发送它们则不起作用。

text/* 的形式发送它们是否不太安全(我认为是)? application/* 如何使它更安全?

相关:CAS REST authentication API accepts text/* but not application/* content type

【问题讨论】:

敏感细节必须在 HTTP 标头而不是 HTTP 正文中发送。就内容类型而言,更多的是为服务完成的设计和实现。 【参考方案1】:

这可能是 CSRF 保护的一种(弱)形式。来自 javascript 的带有application/x-www-form-urlencoded 的跨域调用将按原样到达服务器,因此攻击者可能能够通过发送 AJAX 请求从攻击者的域中登录用户。但是,如果只接受text/html,这样的请求如果是跨域的,则首先触发预检 OPTIONS 请求,如果服务器没有明确允许使用 CORS 标头,浏览器将不会发送实际数据。

因此,请求凭据为 text/html 的 API 比 application/x-www-form-urlencoded 稍微安全一些。除此之外,它对安全性没有太大影响。

(只是松散相关,但请注意,内容类型确实在服务器响应中具有重要的安全影响。JSON 数据不必是 html 编码,因为 JSON 只是一种数据格式,客户端 Javascript 应用程序可以并且应该决定如何渲染或编码下载的数据。但是,如果数据没有以 JSON 编码,任何 JSON 数据“页面”,即如果以text/html 发送,则生成的 JSON 字符串本身容易受到 XSS 攻击,因为浏览器只会渲染它作为 html,在其中运行任何 Javascript。因此 JSON 响应应始终为 application/json,在这种情况下,浏览器不会将其作为 Javascript 运行。)

【讨论】:

以上是关于以 text/html 内容类型发送登录凭据的主要内容,如果未能解决你的问题,请参考以下文章

Response::json() 返回 text/html 作为内容类型

Worklight 将登录凭据传递给 iframed 服务器端内容

Rails3 使用 text/html 内容类型而不是 text/javascript 呈现 js.erb 模板

具有 application/xml+xhtml 内容类型的 Dojo

内容类型 text/html;响应消息的 charset=UTF-8 与绑定的内容类型不匹配 (text/xml; charset=utf-8)

为啥 Jetty 使用 text/html 内容类型提供 css