2011-03-28 4 views
2

"난이도"가 다양한 RoR 응용 프로그램을 구축하고 있습니다. 사이트는 의도적으로 해킹 가능하도록 설계되어 학생들에게 웹 응용 프로그램의 보안을 강화하는 방법을 가르칩니다.난이도가 "수준"인 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 
    

  • +0

    Seth, if/else 블록을 리팩터링하는 방법에 대한 질문 또는 전체 프로그램을 필요로하지 않도록 재 설계하는 방법에 대한 질문입니다. 모델, 컨트롤러 또는 뷰에 대해 특히 걱정하고 있습니까? 아니면 위의 모든 것입니까? 제공 한 정보를 기반으로 리팩토링을 제안하는 것은 어렵습니다. – Andrew

    답변

    2

    lib/안에 모듈을 사용하여 monkeypatching을 사용하는 것이 좋습니다.

    Client 리소스가 필요하다고합시다. 당신은 기본 파일에 대한 "일반"(모든 dificulty 수준에 의해 공유) 기능을 넣어 시작 '매체'에 client.rbclient_controller.rb에 대한

    # /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을 (또는, 거기에 "쉽게"구현을 넣을 수 있습니다) 어려움은 /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 
    

    당신은 어려움에 따라 모든 패치를 포함하는 파일이 필요합니다.

    # /config/initializers/difficulty.rb 
    
    # require 'easy' 
    require 'medium' 
    # require 'difficult' 
    

    그런 다음 응용 프로그램의 세 가지 다른 경우, 쉽게 하나, 하나를 실행할 수 있습니다 :

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

    그래서 당신은 초기화에서 필요할 수 있습니다 : 간단한 해결책이 같은 간단한 파일이 될 것입니다 매체에 그리고 1 개는 곤란하다. 코드는 어려움 .rb 이니셜 라이저를 제외하고는 공유 될 것입니다 (그리고 데이터베이스, 로그 파일 등에 다른 설정 파일이 필요하다고 가정합니다).

    +0

    이것은 모든 것이 환경과 더 간단하게 처리 될 수있는 것처럼 들립니다. – Eric

    +0

    @ Eric : 환경 사용에 대해 생각했지만 어떤 경우에도 초기화 프로그램이 필요하다는 것을 깨달았습니다. 궁극적으로 난 어려움을 환경과 연결하는 데 어떤 이점도 보지 못했습니다. – kikito

    +0

    필자는 어려움 .rb 초기화 프로그램을 주석 처리하는 것보다 특정 환경에서 응용 프로그램을 시작하는 것이 더 간단하다고 생각합니다. 오타가 발생할 가능성이 없습니다. – Eric

    0

    실행을 3 개 레일을 응용 프로그램을 하나에 :. 지금, 나는 같은 (끔찍한) 패턴을 사용하고 있습니다? 레벨 1에서 '해킹'이후의 여러 ...이 방법에 동일한 서버 또는,

    +0

    샌드 박스는 ... 동일한 레이아웃을 사용합니다. 위의 패턴을 반복적으로 사용하여 3 개의 레이아웃과 코드베이스를 처리하는 것보다 – sethvargo

    1

    는 도우미 함수를 사용하거나 학생들에게 어떤 수준을 할당 레벨 2 또는 3의 사이트를 충돌하지 않습니다.

    학생은 레벨을 가지며 애플리케이션 컨트롤러에는

    def level_of(student) 
    

    또는 무엇인가. 특정 사용자 만 일부 모듈/컨트롤러/이것 저것을 액세스 할 수있는 또는 당신이 인증 프로토콜의 일종을 사용할 수

    https://github.com/stffn/declarative_authorization 선언적 인증에 https://github.com/plataformatec/devise

    당신은 당신의 설정/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/end가 반복되는 것보다 더 좋은 패터닝이 있는지 알고 싶습니다 ... 사용자가 실제로 원하는 레벨을 선택하기 위해 드롭 다운을 가지고 있습니다. – sethvargo

    +0

    선언적 인증을 사용하면이를 수행 할 수 있습니다. init 파일에 대한 레벨 및 권한을 선언하고 나머지 작업을 수행 할 필요가 있습니다 (뷰 컨트롤러 등에서 반복 할 필요가 없음) – corroded

    +0

    질문을 이해하고 있다고 생각하지 않습니다. 사용자는 레벨에 묶여 있지 않습니다. 사용자에게는 권한이 없습니다. 레벨은 취약한 코드가 얼마나 중요한지를 결정합니다. 즉, – sethvargo