显示从数据库中获取的数据时是否应该调用 escape_javascript
Should I call escape_javascript when displaying data fetched from the database
我有一个字段在保存到数据库之前处于模型级别 xss_sanatised
。当我想显示它时,我应该在视图中渲染它之前再次 escape_javascript
它吗?
我的查询应该像这样
User.all.pluck(:id, :name).map { id: id, name: escape_javascipt(name)}
而不是
User.all.pluck(:id, :name).map { id: id, name: name }
当我直接在数据库中注入<script>alert('hi')</script>
时,它实际上在UI中执行。
尽管如果不直接编写 SQL 查询,我将无法将该值写入数据库。
所以我是否应该对所有字段使用 escape_javascript
?
编辑
这在 UI 中呈现为使用 select2
的下拉列表
<div input="hidden" id="input"></div>
jQuery('#input').select2({
multiple: false,
data: <%=tech.to_json.html_safe%>,
initSelection : function (element, callback) {
callback(<%= esc.to_json.html_safe %>);
}
});
我认为您在这里感到困惑仅仅是因为您绕过了自己应用程序的清理规则 - 通过直接写入数据库。
默认情况下,您不应该 "trust" 用户输入。应始终将其视为潜在恶意。
您可能选择信任它的一个原因是它是否由内部用户(例如您自己!)提供。
或者,您可能选择信任它的另一个原因是,如果您在保留它之前已经对其进行了清理 - 即您已经明确阻止了任何潜在的恶意输入。
假设您的“xss_sanatised
”输入是安全的(我无法确认,因为您没有共享代码),那么您可以相信用户输入安全的。所以直接在浏览器中显示就好了。
但是,如果你通过"directly writing SQL Queries"手动强制不安全的输入数据库,那么自然上述"input is safe"的假设就失效了。但这是 "impossible" 场景,所以我不会特别担心。
如果你真的想对此更加安全,那么你可以在渲染输入之前重新清理输入。但在我看来,这很可能是矫枉过正。 (无论哪种方式,您只需要对其进行一次消毒!)
escape_javascript
是一个单独的方法,与用户输入清理无关。这与您描述的问题无关。
如果您需要对一个值调用 escape_javascript
,那就去做吧。但同样,由于您没有共享视图渲染代码,我无法告知是否真的需要它。
我有一个字段在保存到数据库之前处于模型级别 xss_sanatised
。当我想显示它时,我应该在视图中渲染它之前再次 escape_javascript
它吗?
我的查询应该像这样
User.all.pluck(:id, :name).map { id: id, name: escape_javascipt(name)}
而不是
User.all.pluck(:id, :name).map { id: id, name: name }
当我直接在数据库中注入<script>alert('hi')</script>
时,它实际上在UI中执行。
尽管如果不直接编写 SQL 查询,我将无法将该值写入数据库。
所以我是否应该对所有字段使用 escape_javascript
?
编辑
这在 UI 中呈现为使用 select2
的下拉列表<div input="hidden" id="input"></div>
jQuery('#input').select2({
multiple: false,
data: <%=tech.to_json.html_safe%>,
initSelection : function (element, callback) {
callback(<%= esc.to_json.html_safe %>);
}
});
我认为您在这里感到困惑仅仅是因为您绕过了自己应用程序的清理规则 - 通过直接写入数据库。
默认情况下,您不应该 "trust" 用户输入。应始终将其视为潜在恶意。
您可能选择信任它的一个原因是它是否由内部用户(例如您自己!)提供。
或者,您可能选择信任它的另一个原因是,如果您在保留它之前已经对其进行了清理 - 即您已经明确阻止了任何潜在的恶意输入。
假设您的“xss_sanatised
”输入是安全的(我无法确认,因为您没有共享代码),那么您可以相信用户输入安全的。所以直接在浏览器中显示就好了。
但是,如果你通过"directly writing SQL Queries"手动强制不安全的输入数据库,那么自然上述"input is safe"的假设就失效了。但这是 "impossible" 场景,所以我不会特别担心。
如果你真的想对此更加安全,那么你可以在渲染输入之前重新清理输入。但在我看来,这很可能是矫枉过正。 (无论哪种方式,您只需要对其进行一次消毒!)
escape_javascript
是一个单独的方法,与用户输入清理无关。这与您描述的问题无关。
如果您需要对一个值调用 escape_javascript
,那就去做吧。但同样,由于您没有共享视图渲染代码,我无法告知是否真的需要它。