2011-03-28 96 views
2

我建设有不同程度的一个RoR应用程序的“级别”一个RoR应用程序“的困难。”该网站被故意设计为可破解,以教会学生如何更好地保护他们的网络应用程序。发展困难

在困难的每个水平日益提高,消毒/安全检查将是更高级一些。对于SQL注入的例子:

  • 初级 - 只需插入'和你打出来到原始SQL
  • 中级 - 插入'断裂成原始SQL,但某些关键字(如DROP,ALTER等)是“封杀” ...
  • 高级 - 用户名密码&完全消毒,但是从不同的字符集容易受到攻击,等...

什么是在干燥方式实现代码的最佳方式?现在,我使用的是(可怕的)模式,如:。

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

这发生多次:(什么是最好的方式来实现这种模式的

+0

Seth,你的问题是如何重构if/else块,或者如何重新设计整个程序来不需要它?您是否特别担心您的模型,控制器或视图 - 或以上所有内容?根据您提供的信息很难提出重构建议。 – Andrew 2011-03-28 15:24:28

回答

2

这似乎是一个好地方使用的monkeypatching,利用内幕lib/modules目录。

说你想要一个Client资源。你可以先把“共同”(由所有做太困难级别共享)功能的默认文件(或者,你可以把“易”的实施有)

# /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 

Monkeypatches为client.rbclient_controller.rb的“媒介”上困难可以放在/lib/medium模块内部:

​​

您将需要一个包括所有那些因困难的补丁文件。一个简单的解决方案将是一个简单的文件是这样的:

# /config/initializers/difficulty.rb 

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

然后,您可以启动应用程序的三种不同的情况下,一个在简单的,一:

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

所以,你可以从一个初始化需要它在中等和一个在困难。代码将被共享,但难度.rb初始值设定项例外(我假设您还需要数据库,日志文件等不同的配置文件)。

+0

从这听起来,整个事情听起来像可以更简单地用环境来处理。 – Eric 2011-03-28 19:57:21

+0

@Eric:我想过使用环境,但是我意识到无论如何我都需要一个初始化器。最终,我没有看到将环境与难度联系起来的优势。 – kikito 2011-03-29 10:00:42

+0

通过我的阅读,我认为使用特定的环境启动应用程序要比对(难)评论难度.rb初始化程序更简单。没有错别字的机会。 – Eric 2011-03-30 01:42:20

0

运行3个Rails应用程序,无论是在?在多...这样在同一台服务器或接替的“黑客”在1水平不会崩溃的网站为2级或3

+0

它是沙盒......并且它们使用相同的布局等。我宁愿重复上述模式,也不愿意使用3个独立的布局和代码库来处理 – sethvargo 2011-03-28 15:13:22

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 

等等等等

所有你需要做的是告诉我们的控制器,它的使用声明身份验证,它会做休息。

+0

,但这不能回答问题。我知道如何为学生分配角色。我想知道,如果/ elsif/else /结束执行各种级别,除了重复以外还有更好的构图方式...用户实际上有一个下拉框可以选择他们想要的级别 – sethvargo 2011-03-28 15:20:50

+0

声明式验证可以为您执行此操作。需要在init文件中声明级别和权限,并让其完成剩下的工作(如果视图控制器中的elses等不需要重复) – corroded 2011-03-28 15:24:25

+0

我不认为你理解这个问题。用户不被绑定到一个级别。用户没有权限。这个级别决定了代码是多么脆弱,就是这样 – sethvargo 2011-03-28 16:20:53