2011-03-28 94 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