InfoGrab DocsInfoGrab Docs

모델 및 서비스 스팸 방지 및 CAPTCHA 지원

요약

REST API, GraphQL API 또는 Web UI에 스팸 또는 CAPTCHA 지원을 추가하기 전에 먼저 다음에 필요한 지원을 추가해야 합니다: 백엔드 ActiveRecord 모델. 지원하는 스팸 또는 CAPTCHA 요청 구현 유형에 관계없이 다음 변경 사항의 전부 또는 대부분이 필요합니다.

REST API, GraphQL API 또는 Web UI에 스팸 또는 CAPTCHA 지원을 추가하기 전에 먼저 다음에 필요한 지원을 추가해야 합니다:

  • 백엔드 ActiveRecord 모델.

  • 서비스 레이어.

지원하는 스팸 또는 CAPTCHA 요청 구현 유형에 관계없이 다음 변경 사항의 전부 또는 대부분이 필요합니다. GraphQL API를 기반으로 완전히 구축된 일부 최신 기능에는 컨트롤러가 없을 수 있으며, 컨트롤러에 mark_as_spam 액션을 추가할 필요가 없습니다.

이를 수행하려면:

ActiveRecord 모델에 Spammable 지원 추가#

  • 모델 클래스에 Spammable 모듈을 포함합니다:

    include Spammable
    
  • 스팸 검사 대상 필드를 나타내기 위해 attr_spammable을 추가합니다. 모델당 최대 두 개의 필드("title""description")를 지원합니다. 어떤 필드를 "title" 또는 "description"으로 지정할지 설정할 수 있습니다. 예를 들어, 다음 줄은 content 필드를 description으로 지정합니다:

    attr_spammable :content, spam_description: true
    
  • #check_for_spam? 메서드 구현을 추가합니다:

    def check_for_spam?(user:)
      # Return a boolean result based on various applicable checks, which may include
      # which attributes have changed, the type of user, whether the data is publicly
      # visible, and other criteria. This may vary based on the type of model, and
      # may change over time as spam checking requirements evolve.
    end
    

이 메서드의 구현 예시는 기존의 다른 Spammable 모델을 참조하여 필요한 로직 검사를 확인하세요.

컨트롤러에 mark_as_spam 액션 지원 추가#

SpammableActions::AkismetMarkAsSpamAction 모듈은 컨트롤러에 #mark_as_spam 액션 지원을 추가합니다. 이 컨트롤러를 통해 관리자는 Admin 영역의 스팸 로그 섹션에서 연결된 Spammable 모델의 스팸을 관리할 수 있습니다.

  • 컨트롤러에 SpammableActions::AkismetMarkAsSpamAction 모듈을 포함합니다.

    include SpammableActions::AkismetMarkAsSpamAction
    
  • #spammable_path 메서드 구현을 추가합니다. 스팸 관리 페이지는 편집 후 이 페이지로 리다이렉트됩니다. 필요한 경로 로직의 예시는 기존의 다른 컨트롤러 구현을 참조하세요. 일반적으로 Spammable 모델 컨트롤러의 #show 액션이어야 합니다.

    def spammable_path
      widget_path(widget)
    end
    

기능이 구현되는 방식에 따라 컨트롤러에 다른 변경 사항이 필요할 수 있습니다. 자세한 내용은 Web UI를 참조하세요.

서비스의 execute 메서드에 check_for_spam 호출 추가#

이 접근 방식은 스팸 가능한 속성을 유지할 수 있는 모든 서비스에 적용됩니다:

  • app/services 하위의 관련 Create 또는 Update 서비스에서 모델의 check_for_spam 메서드를 호출합니다.

  • 스팸 검사가 실패하는 경우:

    모델에 오류가 추가되어 모델이 유효하지 않게 되고 저장이 방지됩니다.

    • needs_recaptcha 속성이 true로 설정됩니다.

이러한 모델 변경을 통해 이후의 백엔드 및 프론트엔드 CAPTCHA 로직으로 처리할 수 있게 됩니다.

각 관련 서비스에 다음 변경 사항을 적용합니다:

  • execute 메서드에서 모델의 check_for_spam 메서드를 호출합니다. (서비스가 해당 패턴을 사용하는 경우 before_create 또는 before_update를 사용할 수도 있습니다.) 이 메서드는 이름 있는 인수(named arguments)를 사용하므로, 기존 예시를 참조하면 사용법을 명확히 이해할 수 있습니다. 그러나 두 가지 중요한 고려 사항이 있습니다:

    check_for_spam은 저장되지 않은(dirty) Spammable 모델 인스턴스에 필요한 모든 변경 사항이 적용된 후에 실행되어야 합니다. 이 순서를 지켜야 스팸 검사 대상 속성이 존재하게 됩니다.

    • check_for_spam은 모델의 오류를 검사하고 save를 시도하기 전에 실행되어야 합니다. 모델의 변경된 속성에서 잠재적인 스팸이 감지되면 저장을 방지해야 합니다.
    module Widget
      class CreateService < ::Widget::BaseService
        # NOTE: We add a default value of `true` for `perform_spam_check`, because spam checking is likely to be necessary.
        def initialize(project:, current_user: nil, params: {}, perform_spam_check: true)
          super(project: project, current_user: current_user, params: params)
    
          @perform_spam_check = perform_spam_check
        end
    
        def execute
          widget = Widget::BuildService.new(project, current_user, params).execute
    
          # More code that may manipulate dirty model before it is spam checked.
    
          # NOTE: do this AFTER the spammable model is instantiated, but BEFORE
          # it is validated or saved.
          widget.check_for_spam(user: current_user, action: :create) if perform_spam_check
    
          # Possibly more code related to saving model, but should not change any attributes.
    
          widget.save
        end
    
        private
    
        attr_reader :perform_spam_check
    

모델 및 서비스 스팸 방지 및 CAPTCHA 지원

GitLab v19.1
원문 보기
요약

REST API, GraphQL API 또는 Web UI에 스팸 또는 CAPTCHA 지원을 추가하기 전에 먼저 다음에 필요한 지원을 추가해야 합니다: 백엔드 ActiveRecord 모델. 지원하는 스팸 또는 CAPTCHA 요청 구현 유형에 관계없이 다음 변경 사항의 전부 또는 대부분이 필요합니다.

REST API, GraphQL API 또는 Web UI에 스팸 또는 CAPTCHA 지원을 추가하기 전에 먼저 다음에 필요한 지원을 추가해야 합니다:

  • 백엔드 ActiveRecord 모델.

  • 서비스 레이어.

지원하는 스팸 또는 CAPTCHA 요청 구현 유형에 관계없이 다음 변경 사항의 전부 또는 대부분이 필요합니다. GraphQL API를 기반으로 완전히 구축된 일부 최신 기능에는 컨트롤러가 없을 수 있으며, 컨트롤러에 mark_as_spam 액션을 추가할 필요가 없습니다.

이를 수행하려면:

ActiveRecord 모델에 Spammable 지원 추가#

  • 모델 클래스에 Spammable 모듈을 포함합니다:

    include Spammable
    
  • 스팸 검사 대상 필드를 나타내기 위해 attr_spammable을 추가합니다. 모델당 최대 두 개의 필드("title""description")를 지원합니다. 어떤 필드를 "title" 또는 "description"으로 지정할지 설정할 수 있습니다. 예를 들어, 다음 줄은 content 필드를 description으로 지정합니다:

    attr_spammable :content, spam_description: true
    
  • #check_for_spam? 메서드 구현을 추가합니다:

    def check_for_spam?(user:)
      # Return a boolean result based on various applicable checks, which may include
      # which attributes have changed, the type of user, whether the data is publicly
      # visible, and other criteria. This may vary based on the type of model, and
      # may change over time as spam checking requirements evolve.
    end
    

이 메서드의 구현 예시는 기존의 다른 Spammable 모델을 참조하여 필요한 로직 검사를 확인하세요.

컨트롤러에 mark_as_spam 액션 지원 추가#

SpammableActions::AkismetMarkAsSpamAction 모듈은 컨트롤러에 #mark_as_spam 액션 지원을 추가합니다. 이 컨트롤러를 통해 관리자는 Admin 영역의 스팸 로그 섹션에서 연결된 Spammable 모델의 스팸을 관리할 수 있습니다.

  • 컨트롤러에 SpammableActions::AkismetMarkAsSpamAction 모듈을 포함합니다.

    include SpammableActions::AkismetMarkAsSpamAction
    
  • #spammable_path 메서드 구현을 추가합니다. 스팸 관리 페이지는 편집 후 이 페이지로 리다이렉트됩니다. 필요한 경로 로직의 예시는 기존의 다른 컨트롤러 구현을 참조하세요. 일반적으로 Spammable 모델 컨트롤러의 #show 액션이어야 합니다.

    def spammable_path
      widget_path(widget)
    end
    

기능이 구현되는 방식에 따라 컨트롤러에 다른 변경 사항이 필요할 수 있습니다. 자세한 내용은 Web UI를 참조하세요.

서비스의 execute 메서드에 check_for_spam 호출 추가#

이 접근 방식은 스팸 가능한 속성을 유지할 수 있는 모든 서비스에 적용됩니다:

  • app/services 하위의 관련 Create 또는 Update 서비스에서 모델의 check_for_spam 메서드를 호출합니다.

  • 스팸 검사가 실패하는 경우:

    모델에 오류가 추가되어 모델이 유효하지 않게 되고 저장이 방지됩니다.

    • needs_recaptcha 속성이 true로 설정됩니다.

이러한 모델 변경을 통해 이후의 백엔드 및 프론트엔드 CAPTCHA 로직으로 처리할 수 있게 됩니다.

각 관련 서비스에 다음 변경 사항을 적용합니다:

  • execute 메서드에서 모델의 check_for_spam 메서드를 호출합니다. (서비스가 해당 패턴을 사용하는 경우 before_create 또는 before_update를 사용할 수도 있습니다.) 이 메서드는 이름 있는 인수(named arguments)를 사용하므로, 기존 예시를 참조하면 사용법을 명확히 이해할 수 있습니다. 그러나 두 가지 중요한 고려 사항이 있습니다:

    check_for_spam은 저장되지 않은(dirty) Spammable 모델 인스턴스에 필요한 모든 변경 사항이 적용된 후에 실행되어야 합니다. 이 순서를 지켜야 스팸 검사 대상 속성이 존재하게 됩니다.

    • check_for_spam은 모델의 오류를 검사하고 save를 시도하기 전에 실행되어야 합니다. 모델의 변경된 속성에서 잠재적인 스팸이 감지되면 저장을 방지해야 합니다.
    module Widget
      class CreateService < ::Widget::BaseService
        # NOTE: We add a default value of `true` for `perform_spam_check`, because spam checking is likely to be necessary.
        def initialize(project:, current_user: nil, params: {}, perform_spam_check: true)
          super(project: project, current_user: current_user, params: params)
    
          @perform_spam_check = perform_spam_check
        end
    
        def execute
          widget = Widget::BuildService.new(project, current_user, params).execute
    
          # More code that may manipulate dirty model before it is spam checked.
    
          # NOTE: do this AFTER the spammable model is instantiated, but BEFORE
          # it is validated or saved.
          widget.check_for_spam(user: current_user, action: :create) if perform_spam_check
    
          # Possibly more code related to saving model, but should not change any attributes.
    
          widget.save
        end
    
        private
    
        attr_reader :perform_spam_check