我读过一篇关于防止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>
但是,当我在API模式下传递此name
时,它不起作用
POSTMAN
url?name=<script>alert(1)</script>
Rails应用程序
params[:name]
输出将为"<script>alert(1)</script>"
它是否有在API模式下正常工作的配置?
接收这样的数据不是攻击。显示它是一种攻击。
默认情况下,Rails在HTML上下文中进行转义,并且仅在HTML上下文内进行转义,因此当您这样做时:
<p><%= params[:name] %></p>
您将看到被渲染为无害的转义版本。唯一的解决办法是,如果你特意用html_safe
声明它是安全的,除非你确信它是安全,否则你不会这么做。
如果你有一个完全没有前端的API风格的应用程序,恭喜你,你不会受到XSS攻击。然而,你的客户需要采取预防措施,确保他们在适当的背景下正确地避开任何内容。
换句话说,除非显示HTML,否则Rails不会也不应该在意。
请记住,参数本身从未被更改,只是在显示之前进行了转义。