CAPTCHAの探索的テスト
CAPTCHA はレビューアプリやローカルの開発環境で確実にテストできます(GDK) 。いつでもできます:
- reCAPTCHAがサポートされている場所では、強制的にreCAPTCHAを表示させることができます。
- 道路標識の画像を検索して選択する代わりに、チェックボックスを強制的に表示します。
テストを設定するには、このページの設定に従ってください。
適切なテストデータの使用
スパム/CAPTCHAが有効になっているシナリオをテストしていることを確認してください。例:_公開_スニペットのみがスパムチェックされるため、公開スニペットを編集していることを確認してください。
機能フラグを有効にします。
スパム/CAPTCHAサポートが機能フラグの背後にある場合、関連する機能フラグを有効にします。
AkismetとreCAPTCHAの設定
- reCAPTCHAを設定します:
- GitLab reCAPTCHAのドキュメントをレビューしてください。
- GoogleのreCAPTCHAドキュメントの指示に従って、Googleの公式テスト用reCAPTCHA認証情報を取得してください。
-
サイトキーは
6LeIxAcTAAAAAJcZVRqyHh71UMIEGNQ_MXjiZKhI
-
シークレットキーは、次のようにします:
6LeIxAcTAAAAAGG-vFI1TnRWxMZNFuojJ4WifJWe
-
サイトキーは
-
管理 -> 設定 -> レポーティング設定:
http://gdk.test:3000/admin/application_settings/reporting#js-spam-settings
- スパムおよびボット対策セクションを展開します。
- reCAPTCHAを有効にする」を選択します。この機能をテストする場合を除き、ログインを有効にする必要はありません。
- サイトキーと シークレットキーを入力します。
- Akismetを設定するには
- Akismetに関するGitLabのドキュメントをレビューしてください。
- Akismet API キーを取得します。Akismet からテスト用のキーをサインアップすることができます。サインアップする際には、ローカルホスト(
gdk.test
など)とEメールを入力する必要があります。 - GitLabのAkismet設定ページなどにアクセスしてください:
http://gdk.test:3000/admin/application_settings/reporting#js-spam-settings
- Akismetを有効にし、AkismetAPIキーを入力してください。
- Akismetの誤検知によるスパムチェックを行うには、Akismet APIドキュメントおよびAkismet Getting Startedドキュメントを参照してください:
-
akismet-guaranteed-spam@example.com
を作成者のメールとして使用することで、以下の手順で強制的にスパムチェックを行うことができます:- ユーザーメール設定に移動します:
http://gdk.test:3000/-/profile/emails
- 管理者ユーザーのセカンダリメールとして
akismet-guaranteed-spam@example.com
を追加します。 - Railsコンソールで確認してください:
bin/rails c
->User.find_by_username('root').emails.last.confirm
- この確認済みのメールをプライマリメールとして切り替えてください:
- アバターのドロップダウンリスト -> プロフィールの編集 -> メイン設定.
-
Eメールには
admin@example.com
の代わりにakismet-guaranteed-spam@example.com
と入力してください。 - プロフィール設定を更新」を選択して、変更を保存します。
- ユーザーメール設定に移動します:
-
ウェブUIでのテスト
上記の設定がすべて完了したら、CAPTCHA をテストすることができます。以下のような、すでに CAPTCHA をサポートしているアプリケーションの領域でテストしてください:
- イシューの作成または編集。
- 公開スニペットの作成または編集。公開スニペットのみがスパムチェックされます。
開発環境でのテスト
上記の手順でスパムフラグ + CAPTCHA を強制した後、スパムで保護されたモデル/コントローラのアクションで動作をテストできます。
CAPTCHAを有効にしてテストします (CONDITIONAL_ALLOW評決)
これらのエリアで CAPTCHA が有効になっている場合、フォームを再送信する前に CAPTCHA ポップアップモーダルを解決する必要があります:
- 管理 -> 設定 -> レポート -> スパム
- ボット対策 -> reCAPTCHA を有効にします。
CAPTCHA を無効にした状態でのテスト (“DISALLOW “判定)
Admin -> Settings -> Reporting -> SpamandAnti-bot Protection -> Enable reCAPTCHA で CAPTCHA が無効になっている場合、CAPTCHA ポップアップは表示されません。この場合、フォームを送信することはできません。
reCAPTCHAを表示するHTMLページ
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の動作に関するさまざまなシナリオの手動探索テストを実行するために必要な手順を説明します。
前提条件としては
- 開発環境で Spam と CAPTCHA を有効にし、フォームの送信に CAPTCHA を要求するようにするために、上記のすべての手順を実行する必要があります。
- 有効な CAPTCHA レスポンス文字列を手動で生成するためのフォームをコンテナに含むページで、
/public
ディレクトリの下に CAPTCHA をレンダリングする HTML ページが作成されていることを確認してください。Akismet と reCAPTCHA のセットアップに記載されているGoogle の公式テスト用 reCAPTCHA 認証情報を使用する場合、CAPTCHA レスポンス文字列の内容は問題ではありません。 - Admin -> Settings -> Reporting -> Spam and Anti-bot protectionにアクセスしてください。
- あなたのシナリオの必要性に応じて、reCAPTCHAと Akismetを有効にするを選択またはクリアします。
以下の例では、スニペット作成を例にしています。スニペット更新、イシュー作成、イシュー更新を使用することもできます。イシューとスニペットはスパムおよびCAPTCHAを完全にサポートする唯一のモデルです。
初期設定
- APIトークンを作成します。
- RESTコマンド用にターミナルでエクスポートします:
export PRIVATE_TOKEN=<your_api_token>
- GraphiQLエクスプローラーを使用する前に、
localhost:3000
、GitLab開発環境にサインインしていることを確認してください。GraphiQLエクスプローラーはGraphQLクエリを実行するための認証として、認証されたユーザーを使用するからです。 - GraphQLの例については、
http://localhost:3000/-/graphql-explorer
にあるGraphiQLエクスプローラーを使用してください。 - ステータス コードを含む HTTP レスポンス ヘッダーを表示するには、
curl
に--include
(-i
) オプションを使用します。
シナリオAkismetとCAPTCHAが有効な場合
この例では、AkismetとCAPTCHAが有効になっています:
初回リクエスト
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リクエスト:
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は表示されません。