APIでスパム対策をする
APIでスパム対策をする
ロボットやスパマーなど誰でもフィードバックを投稿すること可能な状態ですので,“验证码”を追加したり,サードパーティのAPIを使用して,ロボットからの投稿から保護することを考えます。
Akismetを使用することにしましょう。ここでは,アウトオブバンドにAkismetのAPIを呼ぶ方法を説明します。
Akismetに登録する
akismet.comの無料アカウントに登録し,Akismet APIキ,を取得します。
欧宝娱乐app下载地址Symfony HTTPClientコンポ,ネントに依存させる
Akismet APIを抽象化したライブラリを使用するのではなく,まず直接APIを呼んでみましょう。HTTP呼び出しがより効率的です(S欧宝娱乐app下载地址ymfonyプロファイラが使用できるのでSymfonyデバッグツールの恩恵が得られます)。
スパムチェッカ,クラスを設計する
src /
以下に,新しいクラスSpamChecker
を追加し,Akismet APIの呼び出しロジックをラップしてレスポンスを解釈させます:
HTTPクラaaplアントの请求()
メソッドは,Akismet网址($ this - >端点
)に张贴リクエストを行い,パラメ,タ,の配列を渡します。
getSpamScore ()
メソッドはAPI呼び出しのレスポンスに応じて3の値を返します:
2
:コメントが"露骨なスパム";1
コメントがスパムの可能性がある;0
コメントがスパムでない。
提示
特別なメ,ルアドレスのakismet-guaranteed-spam@example.com
を使用すると強制的にスパムと判定させることができます。
環境変数を使用する
SpamChecker
クラスはakismetKey美元
引数が必要です。ファ▪▪ルアップロ▪▪ドのディレクトリのときと同じようにオトワヤ
アノテションを介してンジェクトします:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
——/ src / SpamChecker.php+ + + b / src / SpamChecker.php@@ -3,6 +3,7 @@名称空间的应用程序;使用App \实体\评论;+使用Sy欧宝娱乐app下载地址mfony \ DependencyInjection \属性\ \组件自动装配;使用Sy欧宝娱乐app下载地址mfony \ \ HttpClient \ HttpClientInterface合同;-11,7 +12,7 @@类SpamChecker公共函数__construct(private HttpClientInterface $client,- string $akismetKey,+ #[Autowire('%env(AKISMET_KEY)%')] string $akismetKey,) {$this->endpoint = sprintf('https://%s.rest.akismet.com/1.1/comment-check', $akismetKey);}
コ,ドにハ,ドコ,ドでAkismetのキ,を書くことは避けたいですので,環境変数の(AKISMET_KEY
)を使用することにします。
“本当の”環境変数をセットするか.env.local
ファ电子邮箱ルに値をセットするかは各エンジニアの判断に任せます:
本番においては,“本当の”環境変数を定義するべきです。
多くの環境変数を管理するのは大変ですので,S欧宝娱乐app下载地址ymfonyは,シークレット情報を格納するのに”ベター”な方法があります。
シ,クレット情報を格納する
たくさんの環境変数を使用する代わりに,欧宝娱乐app下载地址Symfonyでは,シ,クレット情報を格納することができるヴォ,ルトで管理することができます。例えば,メリットの一つとしてリポジトリにヴォールトをコミットすることができます(キーは入れないでください)。さらに,環境毎にヴォ,ルトを管理することも可能です。
シ,クレット情報は,実際の値を覆った環境変数になります。
Akismet Keyをヴォ,ルトに追加します:
1
$欧宝娱乐app下载地址Symfony控制台的秘密:集AKISMET_KEY
1 2 3 4
> [OK] secret "AKISMET_KEY" encrypted in "config/secrets/dev/";你可以承诺。
このコマンドを実行するのは初めてなので,配置/ dev /秘密
ディレクトリにキが2生成されます。そして,AKISMET_KEY
シ,クレットが同ディレクトリに格納されます。
開発時のシ,クレットでは,配置/ dev /秘密
ディレクトリに生成されたヴォ,ルトとそのキ,をコミットすることもできます。
同名の環境変数をセットすることでシ,クレットは上書きすることも可能です。
コメントがスパムかチェックする
新しいコメントが投稿されたときにスパムかチェックする簡単な方法の一つとして,データベースに保存する前にスパムチェッカーを呼び出すことです:
12 34 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
——/ src /控制器/ ConferenceController.php+ + + b / src /控制器/ ConferenceController.php@@ -7,6 +7,7 @@使用App\Entity\Conference;使用App \ \ CommentFormType形式;使用App \ Repository \ CommentRepository;使用App \ Repository \ ConferenceRepository;+使用App \ SpamChecker;使用原则\ ORM \ EntityManagerInterface;控制器使欧宝娱乐app下载地址用Symfony \包\ FrameworkBundle \ \ AbstractController;使用Sy欧宝娱乐app下载地址mfony \ DependencyInjection \属性\ \组件自动装配;@@类ConferenceController扩展AbstractController请求$ Request,会议$ Conference, CommentRepository $ CommentRepository,+ SpamChecker $ SpamChecker,#[autoire ('%photo_dir%')] string $photoDir,): Response {$comment = new comment ();@@ -53,6 +55,17 @@ class ConferenceController extends AbstractController} $this->entityManager->persist($comment);++ $context = [+ 'user_ip' => $request->getClientIp(),+“user_agent”= >请求- >标题- >获取美元(“用户代理”),+“推荐人”= >请求- >标题- >获取美元(“推荐人”),+ 'permalink' => $request->getUri(),+);+ if (2 === $spamChecker->getSpamScore($comment, $context)) {+ throw new \RuntimeException('公然的垃圾邮件,走开!');+}+$ this - > entityManager >冲洗();return $this->redirectToRoute('conference', ['slug' => $conference->getSlug()]);
正しく動作するかチェックする
本番でシ,クレットを管理する
本番では,Platform.shは注意が必要な環境変数の設定をサポ,トしています:
1
$欧宝娱乐app下欧宝体育应用最新版app下载载地址symfony cloud:variable:create——sensitive=1——level=project -y——name=env:AKISMET_KEY——value=abcdef
しかし,上記で議論したように,セキュリティーの面からではなくプロジェクトチームのシークレット管理の面から,欧宝娱乐app下载地址Symfonyのシークレット管理を使う方がベターです。全てのシークレットがリポジトリに格納されるので,唯一の管理するべき本番の環境変数は復号キーのみとなります。こうすることで,少しセットアップが面倒ですが,チームの誰もが本番のサーバーへのアクセス権がなくても,本番のシークレットを追加することができます。
まず,本番用のキ,のペアを生成してください:
1
$欧宝娱乐app下载地址Symfony控制台秘密:generate-keys——env=prod
在Linux及类似操作系统下,请使用
APP_RUNTIME_ENV =刺激
而不是——env =刺激
类型的应用程序的编译刺激
环境:1
$APP_RUNTIME_ENV=prod 欧宝娱乐app下载地址symfony控制台秘密:生成密钥
本番用のAkismetのシ,クレットを本番のヴォ,ルトに再追加してください:
1
$欧宝娱乐app下载地址Symfony控制台的秘密:集AKISMET_KEY - env =刺激
最後に,Platform.shに,注意が必要な値をセットした際の復号キ,を送ってください:
1
$欧宝娱乐app下欧宝体育应用最新版app下载载地址symfony cloud:variable:create——sensitive=1——level=project -y——name=env:SYMFONY_DECRYPTION_SECRET——value= ' php -r“回声base64_encode(包括(“配置/机密/刺激/ prod.decrypt.private.php”));”`
復号キ,は,.gitignore
に自動的に追加されているので,コミットされることはありませんので,全てのファイルを追加することができます。デプロが終わったので,安全のために,ロカルマシンから削除しておいてください:
1
$Rm -f config/secrets/prod/prod.decrypt.private.php