Rails API返回JSON时HTML标签被转义为Unicode如何解决
问题原因
Rails框架默认开启了JSON返回时的HTML实体转义逻辑,会自动把<、>、&、双引号等可能引发XSS风险的字符转换为Unicode转义序列,该逻辑和你是否调用to_s转换字符串无关。
解决方案
方案1:单接口局部生效(推荐)
不需要修改全局配置,仅在需要返回原字符的接口render时添加escape_html_entities: false参数即可:
# 原有业务逻辑保持不变 result.each do |row| i = row["i"].to_s j = row["j"].to_s obj[i][j] = {} obj[i][j]["name"] = row["name"].to_s end # 返回JSON时添加关闭转义的参数 render json: obj, escape_html_entities: false
方案2:全局关闭HTML实体转义
如果所有接口都需要返回原字符,可以在Rails初始化配置中关闭全局转义开关:
- 新建配置文件
config/initializers/json_escape.rb - 写入以下内容:
ActiveSupport.escape_html_entities_in_json = false
注意:全局关闭后如果前端直接渲染接口返回的用户输入内容,可能存在XSS注入风险,需要前端自行做好转义处理。
方案3:Jbuilder模板场景
如果你使用Jbuilder构建JSON返回内容,使用raw!方法包裹需要原样输出的字段即可:
json.name raw! row["name"]
内容的提问来源于stack exchange,提问作者smit
相关产品推荐
相关产品推荐

