ruby-on-rails - Rails的api模式下如何防止XSS攻击?
问题描述
我读过一篇关于防止 XSS 攻击的文章。它解释说,Rails 本身可以防止一些攻击。实际上 Rails 使用ERB::Util#html_escape函数来转义 HTML 实体。
<b>Hello <%= params[:name] %></b>
如果上面被 攻击?name=<script>alert(1)</script>
,输出将如下:
<b> Hello <script>alert(1)</script>gt; </b>
但是,当我name
在 API 模式下传递它时,它不起作用。
邮差
url?name=<script>alert(1)</script>
Rails App
params[:name]
的输出将是"<script>alert(1)</script>"
.
它是否有任何配置可以在 API 模式下正常工作?
解决方案
接收这样的数据不是攻击。显示它是一种攻击。
默认情况下,Rails 在 HTML 上下文中转义,并且只在 HTML 上下文中,所以当你这样做时:
<p><%= params[:name] %></p>
您会看到转义版本变得无害。解决这个问题的唯一方法是,如果你特意用 声明它是安全的html_safe
,除非你确定它是安全的,否则你不会这样做。
如果您有一个完全没有前端的 API 风格的应用程序,那么恭喜您,您可以免受 XSS 攻击。但是,您的客户需要采取预防措施,以确保他们正确地转义任何内容以适应其呈现的适当上下文。
换句话说,除非显示 HTML,否则 Rails 不会也不应该关心。
请记住,参数本身永远不会改变,它只是在显示之前转义。
推荐阅读
- neo4j - APOC迭代调用中的Neo4j yield语句?
- python - 如何用 2D 列表替换此方法?
- php - 通过 API 在外部应用程序中创建多条记录时的 Laravel 最佳实践
- android - netty slf logging init 在 android 单元测试中失败
- javascript - 当错误消息只是临时文本气泡时如何创建有意义的单元测试
- typescript - 打字稿简单项目上不存在元素属性
- pyspark - 如何在 PySpark 数据框中添加具有字符串值 + 来自另一列的值的列
- php - 检查小数内包含哪些标志
- javascript - 如何在 express 中使用 Promise 嵌套这个 mysql 查询
- android - Android TV 应用 - 谷歌抱怨横幅没有填满整个空间