CAPTCHAの探索的テスト

CAPTCHA はレビューアプリやローカルの開発環境で確実にテストできます(GDK) 。いつでもできます:

  • reCAPTCHAがサポートされている場所では、強制的に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 など)とEメールを入力する必要があります。
    3. GitLabのAkismet設定ページなどにアクセスしてください:http://gdk.test:3000/admin/application_settings/reporting#js-spam-settings
    4. Akismetを有効にし、AkismetAPIキーを入力してください。
  3. Akismetの誤検知によるスパムチェックを行うには、Akismet APIドキュメントおよびAkismet Getting Startedドキュメントを参照してください:
    1. akismet-guaranteed-spam@example.com を作成者のメールとして使用することで、以下の手順で強制的にスパムチェックを行うことができます:
      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. Eメールには admin@example.comの代わりにakismet-guaranteed-spam@example.com と入力してください。
        3. プロフィール設定を更新」を選択して、変更を保存します。

ウェブUIでのテスト

上記の設定がすべて完了したら、CAPTCHA をテストすることができます。以下のような、すでに CAPTCHA をサポートしているアプリケーションの領域でテストしてください:

  • イシューの作成または編集。
  • 公開スニペットの作成または編集。公開スニペットのみがスパムチェックされます。

開発環境でのテスト

上記の手順でスパムフラグ + CAPTCHA を強制した後、スパムで保護されたモデル/コントローラのアクションで動作をテストできます。

CAPTCHAを有効にしてテストします (CONDITIONAL_ALLOW評決)

これらのエリアで CAPTCHA が有効になっている場合、フォームを再送信する前に CAPTCHA ポップアップモーダルを解決する必要があります:

  • 管理 -> 設定 -> レポート -> スパム
  • ボット対策 -> reCAPTCHA を有効にします。

CAPTCHA を無効にした状態でのテスト (“DISALLOW “判定)

Admin -> Settings -> Reporting -> SpamandAnti-bot Protection -> Enable reCAPTCHA で CAPTCHA が無効になっている場合、CAPTCHA ポップアップは表示されません。この場合、フォームを送信することはできません。

reCAPTCHAを表示するHTMLページ

note
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>
<head>
  <title>reCAPTCHA demo: Explicit render after an onload callback</title>
  <script type="text/javascript">
  var onloadCallback = function() {
    grecaptcha.render('html_element', {
      'sitekey' : '6Ld05AsaAAAAAMsm1yTUp4qsdFARN15rQJPPqv6i'
    });
  };
  function onSubmit() {
    window.document.getElementById('recaptchaResponse').innerHTML = grecaptcha.getResponse();
    return false;
  }
  </script>
</head>
<body>
<form onsubmit="return onSubmit()">
  <div id="html_element"></div>
  <br>
  <input type="submit" value="Submit">
</form>
<div>
  <h1>recaptchaResponse:</h1>
  <div id="recaptchaResponse"></div>
</div>
<script src="https://www.google.com/recaptcha/api.js?onload=onloadCallback&render=explicit"
        async defer>
</script>
</body>
</html>

スパム/CAPTCHA API探索的テスト例

これらのセクションでは、RESTおよびGraphQL APIのSpamおよびCAPTCHAの動作に関するさまざまなシナリオの手動探索テストを実行するために必要な手順を説明します。

前提条件としては

  1. 開発環境で Spam と CAPTCHA を有効にし、フォームの送信に CAPTCHA を要求するようにするために、上記のすべての手順を実行する必要があります。
  2. 有効な CAPTCHA レスポンス文字列を手動で生成するためのフォームをコンテナに含むページで、/public ディレクトリの下に CAPTCHA をレンダリングする HTML ページが作成されていることを確認してください。Akismet と reCAPTCHA のセットアップに記載されているGoogle の公式テスト用 reCAPTCHA 認証情報を使用する場合、CAPTCHA レスポンス文字列の内容は問題ではありません。
  3. Admin -> Settings -> Reporting -> Spam and Anti-bot protectionにアクセスしてください。
  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. ステータス コードを含む HTTP レスポンス ヘッダーを表示するには、curl--include (-i) オプションを使用します。

シナリオ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"
      }
    }
  ]
}

2番目のリクエスト

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リクエスト:

note
GitLab GraphiQL の実装ではヘッダを渡すことができないので、curl クエリとして書かなければなりません。ここでは、curl を使って 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は表示されません。