Rails控制器render json时如何仅单方法禁用&转义为\u0026
Rails单接口关闭JSON中&符号Unicode转义实现
问题背景
Rails框架默认在控制器通过render json:返回JSON数据时,会自动将&等HTML特殊字符转义为Unicode编码\u0026,示例代码如下:
def send_detail render json: { data: "name?surname&otherdetail" } end
访问接口地址localhost:3000/tests/send_detail时,默认返回结果为:
{ "data":"name?surname\u0026otherdetail" }
全局配置项ActiveSupport.escape_html_entities_in_json = false虽然可以关闭该转义逻辑,但会对整个应用的所有JSON返回生效,存在XSS安全隐患,无法满足仅单个接口保留&原样输出的需求。
实现方案
无需修改全局配置,仅在目标接口方法中单独指定序列化规则即可,两种可用写法:
- 写法1:手动序列化JSON时指定关闭转义,直接返回JSON字符串
def send_detail response_data = { data: "name?surname&otherdetail" } # 仅当前to_json调用关闭HTML实体转义,不影响全局配置 json_str = response_data.to_json(escape_html_entities: false) render plain: json_str, content_type: "application/json; charset=utf-8" end
- 写法2:Rails 5及以上版本支持直接在render时传入序列化参数
def send_detail render json: { data: "name?surname&otherdetail" }, json_serializer_options: { escape_html_entities: false } end
两种写法的作用范围都仅限当前接口请求,应用内其他接口仍然会保持默认的HTML特殊字符转义逻辑,不会引入额外安全风险。
内容的提问来源于stack exchange,提问作者r3b00t
相关产品推荐
相关产品推荐

