我正在构建一个具有不同“难度”级别的RoR应用程序。该网站有意设计为可黑客攻击,教会学生如何更好地保护他们的网络应用程序。
在每个难度越来越高的情况下,消毒/安全检查会稍微提高一些。作为SQL注入的一个例子:
'
即可进入RAW sql '
个中断,但某些关键字(如DROP,ALTER等)被“阻止”...... 以干燥的方式对此进行编码的最佳方法是什么?现在,我正在使用(可怕的)模式,如:
if level == 1
# code for beginner
elsif level == 2
# code for intermediate
else
# code for advanced
end
这种情况多次发生:(。实现这种模式的最佳方式是什么?
答案 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.rb
和client_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_authorization或https://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级站点崩溃