开发具有“难度级别”的RoR应用程序

时间:2011-03-28 15:08:57

标签: ruby-on-rails security dry

我正在构建一个具有不同“难度”级别的RoR应用程序。该网站有意设计为可黑客攻击,教会学生如何更好地保护他们的网络应用程序。

在每个难度越来越高的情况下,消毒/安全检查会稍微提高一些。作为SQL注入的一个例子:

  • 初学者 - 只需插入'即可进入RAW sql
  • 中级 - 在RAW sql中插入'个中断,但某些关键字(如DROP,ALTER等)被“阻止”......
  • 高级 - 用户名&密码已完全清理,但容易受到来自不同字符集等的攻击...

以干燥的方式对此进行编码的最佳方法是什么?现在,我正在使用(可怕的)模式,如:

if level == 1
  # code for beginner
elsif level == 2
  # code for intermediate
else
  # code for advanced
end

这种情况多次发生:(。实现这种模式的最佳方式是什么?

3 个答案:

答案 0 :(得分:2)

这似乎是使用monkeypatching的好地方,使用lib /.

中的模块

假设您需要Client资源。首先,将“common”(由所有dificulty级别共享)功能放在默认文件上(或者,您可以将“简单”实现放在那里)

# /app/models/client.rb
class Client < ActiveRecord::Base
  def foo
    # default and/or "easy" implementation
  end
end

# /app/controllers/client_controller.rb
class ClientController < ApplicationController
  def bar
    # default and/or "easy" implementation
  end
end

“中等”难度的client.rbclient_controller.rb的Monkeypatches可以放在/lib/medium模块中:

# /lib/medium/models/client_patch.rb
class Client
  def foo
    # medium implementation
  end
end

# /lib/medium/controllers/client_controller_patch.rb
class ClientController
  def bar
    # medium implementation
  end
end

根据难度,您需要一个包含所有补丁的文件。一个简单的解决方案就是这样一个简单的文件:

# /lib/medium.rb
require 'medium/models/client_patch'
...
require 'medium/controllers/client_controller_patch'

所以你可以从初始化程序中要求它:

# /config/initializers/difficulty.rb

# require 'easy'
require 'medium'
# require 'difficult'

然后,您可以启动应用程序的三个不同实例,一个在easy,一个在medium,一个在困难。代码将被共享,但scar.rb初始化程序除外(我假设您还需要不同的数据库配置文件,日志文件等)。

答案 1 :(得分:1)

使用辅助功能或为学生分配一些级别。

学生将拥有一个级别,并且在您的应用程序控制器中,您有一个

def level_of(student)

或者其他什么。或者您可以使用某种身份验证协议,其中某些用户只能访问某些模块/控制器/诸如此类:

https://github.com/stffn/declarative_authorizationhttps://github.com/plataformatec/devise

在声明身份验证中,您可以将其放在config / authorization_rules.rb中:

authorization do

  role :beginner do
    has_permission_on [:simple_inserts], :to => :manage
  end

  role :intermediate do
    has_permission_on [:simple_inserts], :to => :manage
  end 
end

等等。

你所要做的就是告诉我们的控制器它正在使用声明性auth,它将完成其余的工作。

答案 2 :(得分:0)

运行3个rails应用程序,可以在同一台服务器上运行,也可以运行多个...这样,在第1级的“hack”成功后,不会使2级或3级站点崩溃