将用户创建的javascript保存在数据库中是否安全?

时间:2014-09-19 18:16:10

标签: javascript mysql ruby-on-rails

我正在使用代码游乐场类型的应用程序,其中用户(Web开发人员/设计人员)可以输入HTML,CSS和Javascript并在iframe上查看结果。输入的代码将保存在数据库(MySQL)中,并在show_results视图/操作的iframe中再次呈现。

现在的问题是:将javascripts直接保存在数据库中是否安全?如果没有,那么我应该在哪里/如何保存它?

3 个答案:

答案 0 :(得分:1)

数据库不会成为你的问题。使用预准备语句允许将各种字符安全地存储在数据库中是相当简单的。使用除准备语句之外的任何内容来存储用户输入是不够的,基本上从不推荐。

但是你在谈论允许执行任意javascript,这总是一个安全问题。正如上面的评论者暗示的那样,如果没有安全经验,开发专有技术或者明确希望继续修补将继续出现的漏洞,你将会复制jsfiddle.net的复杂性。 / p>

当然,你应该知道你正在做的事情会完全破坏你设置的任何域名,所以基本上javascript应该只写在一个丢弃的域名或子域名上。 ; t用于任何其他目的。当然,在这样的环境中,简单的框架破坏以及将观众拉出承载框架的网站也是微不足道的。

我确信这只是触及了任意javascript执行(也就是故意的自我跨站点脚本)带来的潜在滥用的表面。

由于你基本上用这个概念重新发明了一个非常危险的轮子,为什么不简单地使用一些已经存在的嵌入服务呢?例如,codepen.io允许您嵌入它的片段。

答案 1 :(得分:1)

是的,如果您在客户端执行javascript,那么作为架构决策是安全的。

在任何网站上,您都可以使用Chrome"检查元素"等工具。在客户端上操纵html,javascript等。您的系统无法假设客户端上的项目未被操纵。这就是服务器端验证仍然如此重要的原因。

我完全不同意kzqai。 如果是这样的话那么小提琴手会遇到严重的麻烦。

有些问题可以通过你正在做的事情更容易地暴露出来,但这些问题已经存在并且只是模糊不清。

IFF你在服务器端执行javascript,这是一个非常复杂的决定。如果可能的话,我会亲自避免它,因为你正在玩的游戏是你能够抓住每一种可能的情况而不是一个坏人能够抓住你没有的那个。

答案 2 :(得分:-1)

只要在SQL语句中插入值时正确转义某些字符,它就是安全的。例如,如果您的Javascript代码是:

var foo = 'hello world';

然后在构建SQL语句时必须转义单引号:

INSERT INTO snippets (code) VALUES ('var foo = ''hello world'';')

在上面的陈述中,两个单引号('')是表示由单引号括起的字符串中的单引号的方式。

有关转义字符的详细信息,请参阅以下链接: http://dev.mysql.com/doc/refman/5.0/en/string-literals.html

修改

正如Stephen P正确指出的那样,如果你在服务器端代码上使用预准备语句,那么引擎盖下的框架将为你替换这些字符。