CAPTCHA의 탐색적 테스트

리뷰 앱 및 로컬 개발 환경(GDK)에서 CAPTCHA를 신뢰할 수 있게 테스트할 수 있습니다. 항상 다음을 할 수 있습니다:

  • 지원되는 경우 reCAPTCHA가 표시되도록 강제로 설정합니다.
  • 거리 표지 이미지를 찾고 선택하는 대신 확인란을 표시하도록 강제로 설정할 수 있습니다.

테스트를 설정하려면 이 페이지의 구성을 따르세요.

적절한 테스트 데이터 사용

스팸/CAPTCHA가 활성화된 시나리오를 테스트하는지 확인하세요. 예를 들어: 스팸을 확인하는 것은 공개 스니펫을 편집하는지 확인하세요.

기능 플래그 활성화

스팸/CAPTCHA 지원이 기능 플래그 뒤에 숨겨져 있는 경우 관련 기능 플래그를 활성화하세요.

Akismet 및 reCAPTCHA 설정

  1. reCAPTCHA 설정:
    1. GitLab reCAPTCHA 문서를 검토합니다.
    2. Google의 reCAPTCHA 문서의 지침에 따라 Google의 공식 테스트 reCAPTCHA 자격 증명을 가져옵니다.
      1. 사이트 키로는 다음을 사용하세요: 6LeIxAcTAAAAAJcZVRqyHh71UMIEGNQ_MXjiZKhI
      2. 비밀 키로는 다음을 사용하세요: 6LeIxAcTAAAAAGG-vFI1TnRWxMZNFuojJ4WifJWe
    3. 관리자 -> 설정 -> 보고 설정으로 이동: http://gdk.test:3000/admin/application_settings/reporting#js-spam-settings
    4. 스팸 및 안티봇 보호 섹션을 확장합니다.
    5. reCAPTCHA 사용를 선택합니다. 로그인을 위해 활성화하는 것은 필요하지 않습니다.
    6. 사이트 키비밀 키를 입력합니다.
  2. Akismet 설정:
    1. Akismet에 대한 GitLab 문서를 검토합니다.
    2. Akismet API 키를 가져옵니다. Akismet에서 테스트 키에 등록할 수 있습니다. 가입할 때 로컬 호스트(예: gdk.test)와 이메일을 입력해야 합니다.
    3. 예를 들어 다음과 같은 GitLab Akismet 설정 페이지로 이동합니다: http://gdk.test:3000/admin/application_settings/reporting#js-spam-settings
    4. Akismet을 활성화하고 Akismet API 키를 입력합니다.
  3. Akismet 잘못된 양성 스팸 확인을 강제로 실행하려면 다음 자세한 내용은 Akismet API 문서Akismet 시작 안내 문서를 참조하세요:
    1. 다음 단계를 따라 스팸을 강제로 사용할 수 있습니다:
      1. 사용자 이메일 설정으로 이동: http://gdk.test:3000/-/profile/emails
      2. 관리자 사용자의 보조 이메일로 akismet-guaranteed-spam@example.com을 추가합니다.
      3. Rails 콘솔에서 확인하세요: bin/rails c -> User.find_by_username('root').emails.last.confirm
      4. 확인된 이메일을 기본 이메일로 전환합니다:
        1. 아바타 드롭다운 목록 -> 프로필 편집 -> 주요 설정으로 이동합니다.
        2. 이메일admin@example.com을 대체하기 위해 akismet-guaranteed-spam@example.com을 입력합니다.
        3. 변경 사항을 저장하려면 프로필 설정 업데이트를 선택합니다.

웹 UI에서 테스트

위의 모든 구성을 완료한 후에야 CAPTCHA를 테스트할 수 있습니다. 스팸 확인을 해야 하는 응용 프로그램 영역에서 테스트할 수 있습니다. 예를 들어:

  • 이슈를 생성하거나 편집합니다.
  • 공개 스니펫을 생성하거나 편집합니다. 스팸 확인은 공개 스니펫에 대해서만 수행됩니다.

개발 환경에서 테스트

위에서 스팸 플래그 지정 + CAPTCHA를 강제로 설정한 후에 스팸을 방지하는 모델/컨트롤러 작업을 테스트할 수 있습니다.

CAPTCHA 활성화된 경우 테스트(조건부 허용 판정)

이러한 영역에서 CAPTCHA가 활성화되어 있는 경우, 양식을 다시 제출하기 전에 CAPTCHA 팝업 모달을 해결해야 합니다:

  • 관리자 -> 설정 -> 보고 -> 스팸
  • 안티봇 보호 -> reCAPTCHA 사용

CAPTCHA가 비활성화된 경우(거부 판정)

CAPTCHA가 관리자 -> 설정 -> 보고 -> 스팸안티봇 보호 -> reCAPTCHA 사용에서 비활성화된 경우, CAPTCHA 팝업이 표시되지 않습니다. 양식을 제출하는 것을 완전히 방지됩니다.

reCAPTCHA를 렌더링하는 HTML 페이지

참고: 만약 Akismet 및 reCAPTCHA 설정에 나열된 Google의 공식 테스트 reCAPTCHA 자격 증명을 사용하는 경우, CAPTCHA 응답 문자열은 중요하지 않습니다. 어떤 문자열이든 상관없습니다. 실제 유효한 키 쌍을 사용하는 경우, 유효한 CAPTCHA 응답을 얻으려면 CAPTCHA를 해결해야 합니다. 이것은 딱 한 번만 하고, 만료되기 전에만 할 수 있습니다.

GraphQL Explorer(http://gdk.test:3000/-/graphql-explorer)를 통해 GraphQL API를 직접 테스트하려면, 이 양식을 통해 reCAPTCHA 응답 문자열을 가져올 수 있습니다: public/recaptcha.html (http://gdk.test:3000/recaptcha.html) :

<html>
<!-- 생략 -->
</html>

스팸/CAPTCHA API 탐색적 테스트 예제

이러한 섹션들은 REST 및 GraphQL API에 대한 스팸 및 CAPTCHA 동작의 여러 시나리오를 수동으로 탐색하는 데 필요한 단계를 설명합니다.

전제 조건으로, 다음을 수행해야 합니다:

  1. 개발 환경에서 스팸 및 CAPTCHA를 가능하게 하고, 양식 제출을 CAPTCHA가 필요하도록 강제합니다.
  2. /public 디렉토리 하위에 CAPTCHA를 렌더링하는 HTML 페이지를 만듭니다. 이 페이지는 유효한 CAPTCHA 응답 문자열을 수동으로 생성하는 양식을 포함해야 합니다. 만약 Akismet 및 reCAPTCHA 설정에 나열된 Google의 공식 테스트 reCAPTCHA 자격 증명을 사용하는 경우, CAPTCHA 응답 문자열의 내용은 중요하지 않습니다.
  3. Admin -> 설정 -> 보고서 -> 스팸 및 항로 봇 보호로 이동합니다.
  4. 시나리오의 필요에 따라 reCAPTCHA 사용Akismet 사용을 선택하거나 해제합니다.

다음 예제들은 코드 조각 생성을 예로 하고 있습니다. 코드 조각 업데이트, 이슈 생성, 이슈 업데이트를 사용할 수도 있습니다. 이슈와 코드 조각은 전체 스팸 및 CAPTCHA를 지원하는 모델입니다.

초기 설정

  1. API 토큰을 만듭니다.
  2. REST 명령을 위해 터미널에서 내보냅니다: export PRIVATE_TOKEN=<your_api_token>
  3. GraphiQL 탐색기를 사용하기 전에 localhost:3000의 GitLab 개발 환경에 로그인되어 있는지 확인합니다. GraphiQL 탐색기는 인증된 사용자를 사용하여 GraphQL 쿼리를 실행하는 권한으로 사용됩니다.
  4. GraphQL 예제를 위해 http://localhost:3000/-/graphql-explorer의 GraphiQL 탐색기를 사용합니다.
  5. curl--include (-i) 옵션을 사용하여 상태 코드를 포함한 HTTP 응답 헤더를 출력합니다.

시나리오: Akismet 및 CAPTCHA 활성화

이 예제에서는 Akismet 및 CAPTCHA가 활성화되어 있습니다:

  1. 초기 요청.

초기 요청

이 초기 요청이 실패하는 이유는 CAPTCHA 응답이 제공되지 않았기 때문입니다.

REST 요청:

curl --request POST --header "PRIVATE-TOKEN: $PRIVATE_TOKEN" "http://localhost:3000/api/v4/snippets?title=Title&file_name=FileName&content=Content&visibility=public"

REST 응답:

{"needs_captcha_response":true,"spam_log_id":42,"captcha_site_key":"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX","message":{"error":"Your snippet has been recognized as spam. Please, change the content or solve the reCAPTCHA to proceed."}}

GraphQL 요청:

mutation {
    createSnippet(input: {
        title: "Title"
        visibilityLevel: public
        blobActions: [
            {
                action: create
                filePath: "BlobPath"
                content: "BlobContent"
            }
        ]
    }) {
        snippet {
            id
            title
        }
        errors
    }
}

GraphQL 응답:

{
  "data": {
    "createSnippet": null
  },
  "errors": [
    {
      "message": "Request denied. Solve CAPTCHA challenge and retry",
      "locations": [
        {
          "line": 22,
          "column": 5
        }
      ],
      "path": [
        "createSnippet"
      ],
      "extensions": {
        "needs_captcha_response": true,
        "spam_log_id": 140,
        "captcha_site_key": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
      }
    }
  ]
}

두 번째 요청

CAPTCHA 응답이 제공되었기 때문에이 요청이 성공합니다.

REST 요청:

export CAPTCHA_RESPONSE="<CAPTCHA response obtained from HTML page to render CAPTCHA>"
export SPAM_LOG_ID="<spam_log_id obtained from initial REST response>"
curl --request POST --header "PRIVATE-TOKEN: $PRIVATE_TOKEN" --header "X-GitLab-Captcha-Response: $CAPTCHA_RESPONSE" --header "X-GitLab-Spam-Log-Id: $SPAM_LOG_ID" "http://localhost:3000/api/v4/snippets?title=Title&file_name=FileName&content=Content&visibility=public"

REST 응답:

{"id":42,"title":"Title","description":null,"visibility":"public", "other_fields": "..."}

GraphQL 요청:

참고: GitLab GraphiQL 구현은 헤더를 전달하는 것을 허용하지 않으므로 이를 curl 쿼리로 작성해야 합니다. 여기서 --data-binary를 사용하여 JSON 포함 쿼리 내 이스케이프 된 이중 인용부호를 올바르게 처리합니다.

export CAPTCHA_RESPONSE="<CAPTCHA response obtained from HTML page to render CAPTCHA>"
export SPAM_LOG_ID="<spam_log_id obtained from initial REST response>"
curl --include "http://localhost:3000/api/graphql" --header "Authorization: Bearer $PRIVATE_TOKEN" --header "Content-Type: application/json" --header "X-GitLab-Captcha-Response: $CAPTCHA_RESPONSE" --header "X-GitLab-Spam-Log-Id: $SPAM_LOG_ID" --request POST --data-binary '{"query": "mutation {createSnippet(input: {title: \"Title\" visibilityLevel: public blobActions: [ { action: create filePath: \"BlobPath\" content: \"BlobContent\" } ] }) { snippet { id title } errors }}"}'

GraphQL 응답:

{"data":{"createSnippet":{"snippet":{"id":"gid://gitlab/PersonalSnippet/42","title":"Title"},"errors":[]}}}

시나리오: Akismet가 활성화되고 CAPTCHA가 비활성화 된 상태

이 시나리오의 경우 관리 영역 설정에서 reCAPTCHA 활성화를 지운 것을 확인하세요. CAPTCHA가 활성화되지 않은 경우, 잠재적인 스팸으로 플래그 지정된 모든 요청은 승인 할 수있는 기회 없이 실패합니다. 그 요청은 CAPTCHA가 활성화되어 해결되었더라도 다시 제출될 수있을지라도 제출되지 못 합니다.

REST 요청은 CAPTCHA가 활성화 된 경우와 동일합니다:

curl --request POST --header "PRIVATE-TOKEN: $PRIVATE_TOKEN" "http://localhost:3000/api/v4/snippets?title=Title&file_name=FileName&content=Content&visibility=public"

REST 응답:

{"message":{"error":"Your snippet has been recognized as spam and has been discarded."}}

GraphQL 요청:

mutation {
    createSnippet(input: {
        title: "Title"
        visibilityLevel: public
        blobActions: [
            {
                action: create
                filePath: "BlobPath"
                content: "BlobContent"
            }
        ]
    }) {
        snippet {
            id
            title
        }
        errors
    }
}

GraphQL 응답:

{
  "data": {
    "createSnippet": null
  },
  "errors": [
    {
      "message": "Request denied. Spam detected",
      "locations": [
        {
          "line": 22,
          "column": 5
        }
      ],
      "path": [
        "createSnippet"
      ],
      "extensions": {
        "spam": true
      }
    }
  ]
}

시나리오: allow_possible_spam 응용 프로그램 설정이 활성화 된 상태

allow_possible_spam 애플리케이션 설정이 활성화되면, API는 200을 반환합니다. 유효한 요청은 모두 성공하며 CAPTCHA가 제시되지 않으며, 요청이 스팸으로 간주되더라도 제출될 수 있습니다.