返回json结果时,有没有好的"Laravel way"转义html?
Is there a good "Laravel way" to escape html when returning json results?
我觉得这应该是一个普遍的问题,但我一直没能找到答案。 Blade 模板使使用 {{ $variable }}
转义 html 变得容易,但是对于将 json 输出到 ajax 请求,则不是那么多。
自然地,我使用的应用程序对用户输入的数据进行大量 ajax 调用,并将结果 return 作为 JSON 发送给客户端,客户端将其呈现在一个 jQuery 数据表。所以考虑这个场景:
$contacts = Contact::whereUserId(Auth::id())
->select('id', 'first_name', 'last_name', 'email', 'age')
->get();
return response()->json($contacts);
我想在将它们呈现在数据表中之前转义 html/script 注入的那些名称字段,例如名字和姓氏。我能想到的唯一方法是遍历 collection 中的每一行,并且对于每一行,遍历每个字段,如果它是一个字符串,则在其上使用 e()
。
Laravel 框架中有什么东西可以处理这个过程吗?还是一个好的包?我不想每次 toJson()
运行 都这样做,因为有时我不想 运行 那个,或者如果它是一个 API 调用我需要 return 原始 json 数据。
有什么建议吗?我目前在 Laravel 5.2.
郑重声明,我的字段中只有少数要包含 html。
更新:正如评论中所指出的,我正在使用数据表。目前,我在要转义的每一列上使用 render
选项,它只是一个闭包,并使用 javascript-based strip tags/html entities 函数。我有点觉得我做错了,考虑到 Laravel 框架的普遍性以及 blade 模板的设置方式,应该有一些功能可以在 Laravel 框架中自动执行此操作,但这是那么考虑一个理想的解决方案?
jQuery DataTables 不会对 HTML 进行转义,因此如果字段包含 <b>Text</b>
,它将默认以 table 中的粗体显示。
您可以使用以下代码在您的响应中编码 HTML 个实体:
return response()->json(array_map('e', $contacts->toArray()));
如果您将 Yajra DataTables 用于 Laravel,它具有 escapeColumns()
方法,您可以使用该方法转义某些或所有列中的 HTML 实体。例如:
return Datatables::of($contacts)
->escapeColumns(['first_name', 'last_name')
->make(true);
我觉得这应该是一个普遍的问题,但我一直没能找到答案。 Blade 模板使使用 {{ $variable }}
转义 html 变得容易,但是对于将 json 输出到 ajax 请求,则不是那么多。
自然地,我使用的应用程序对用户输入的数据进行大量 ajax 调用,并将结果 return 作为 JSON 发送给客户端,客户端将其呈现在一个 jQuery 数据表。所以考虑这个场景:
$contacts = Contact::whereUserId(Auth::id())
->select('id', 'first_name', 'last_name', 'email', 'age')
->get();
return response()->json($contacts);
我想在将它们呈现在数据表中之前转义 html/script 注入的那些名称字段,例如名字和姓氏。我能想到的唯一方法是遍历 collection 中的每一行,并且对于每一行,遍历每个字段,如果它是一个字符串,则在其上使用 e()
。
Laravel 框架中有什么东西可以处理这个过程吗?还是一个好的包?我不想每次 toJson()
运行 都这样做,因为有时我不想 运行 那个,或者如果它是一个 API 调用我需要 return 原始 json 数据。
有什么建议吗?我目前在 Laravel 5.2.
郑重声明,我的字段中只有少数要包含 html。
更新:正如评论中所指出的,我正在使用数据表。目前,我在要转义的每一列上使用 render
选项,它只是一个闭包,并使用 javascript-based strip tags/html entities 函数。我有点觉得我做错了,考虑到 Laravel 框架的普遍性以及 blade 模板的设置方式,应该有一些功能可以在 Laravel 框架中自动执行此操作,但这是那么考虑一个理想的解决方案?
jQuery DataTables 不会对 HTML 进行转义,因此如果字段包含 <b>Text</b>
,它将默认以 table 中的粗体显示。
您可以使用以下代码在您的响应中编码 HTML 个实体:
return response()->json(array_map('e', $contacts->toArray()));
如果您将 Yajra DataTables 用于 Laravel,它具有 escapeColumns()
方法,您可以使用该方法转义某些或所有列中的 HTML 实体。例如:
return Datatables::of($contacts)
->escapeColumns(['first_name', 'last_name')
->make(true);