允许用户输入代码示例的最不危险的方法是什么?

时间:2009-07-03 22:23:11

标签: ruby-on-rails ruby security sql-injection

我正在实现一个Rails应用程序,用户可以在其中存储代码片段供以后参考。我打算使用Markdown进行文本输入,可能会使用wmd markdown editor。 (Stackoverflow使用的那个。)

我有点担心人们在编辑框中输入代码的想法。根据我的理解,存在进入SQL的危险,这可能会搞砸我的数据库,或者输入稍后会运行的JavaScript并做恶作剧。

通常情况下,Rails具有防范此功能的功能,但我是否处于特殊情况,因为我的用户会被鼓励输入代码片段?

我应该注意哪些额外的预防措施?

3 个答案:

答案 0 :(得分:5)

只需清理您的数据库条目,您就可以了。 Rails现在默认执行此操作。你只需要正确使用框架。请查看此信息以获取更多信息:http://wiki.rubyonrails.org/howtos/security/sql_injection

DO THIS:

Project.find(:all, :conditions => ["name = ?", params[:name]])
# or
Project.find(:all, :conditions => {:name => params[:name]})

不是这样:

Project.find(:all, :conditions => "name = '#{params[:name]}'")

您还必须通过

来防止XSS攻击
<%=h possible_harmful_text %>

供参考:

  

跨站点脚本(XSS)是一种类型   计算机安全漏洞   通常在Web应用程序中找到   允许代码注入   恶意网络用户进入网页   其他用户查看。示例   这样的代码包括客户端脚本。   一个被利用的跨站点脚本   漏洞可以被攻击者使用   绕过访问控制,如   同源政策。漏洞   这种被利用来制作   强大的网络钓鱼攻击和浏览器   战功。进行跨站点脚本编写   在网站上约占80%   所有文件证据   截至2007年的漏洞。经常   在一次袭击中“一切都看起来   对可能的最终用户来说很好   受到未经授权的访问,被盗   敏感数据和财务数据   失利。   (via wikipedia

当然

  

SQL注入是代码注入   利用安全性的技术   漏洞发生在   应用程序的数据库层。该   用户存在漏洞   输入被错误地过滤   用于字符串文字转义字符   嵌入在SQL语句或用户中   输入不是强类型的   从而意外地执行。它是   一个更一般的类的实例   可能发生的漏洞   无论何时编程或编写脚本   语言嵌入另一个语言。   SQL注入攻击也是已知的   作为SQL插入攻击。1   (via wikipedia

答案 1 :(得分:3)

您不会处于特殊情况,因为我们鼓励用户输入代码段。人们可以在不鼓励他们的字段中输入代码片段。基本上,你应该总是“格外小心”。不要相信用户输入。

答案 2 :(得分:2)

您实际上在接受代码 samples 方面处于更安全的位置,而不是允许实际的代码。我的意思是,例如, Stack Overflow让我输入实际的HTML来控制我的帖子。

允许实际代码太多更危险,因为您将评估该代码。在Stack Overflow示例中,该站点实际上正在评估像<a href="http://example.com/">link</a>这样的输入标记 - 这意味着它需要在寻找onclick处理程序等等。彻底的清理比简单地转义要困难得多。

因此,只要您不评估任何内容,您就可以与接受文本输入的任何其他网站在同一条船上。坚持标准数据输入原则 - 例如

。在任何地方写入之前立即转义任何和所有输入 - 你会没事的。