使用API防止垃圾邮件
使用API防止垃圾邮件
任何人都可以提交反馈。甚至是机器人、垃圾邮件发送者等等。我们可以在表单中添加一些“验证码”,以某种方式防止机器人入侵,或者我们可以使用一些第三方api。
我决定使用免费的Akismet服务来演示如何调用API以及如何进行“带外”调用。
在Akismet注册
注册一个免费帐户akismet.com并获得Akismet API密钥。
依赖于Symfony HTob娱乐下载TPClient组件
我们将直接执行所有API调用,而不是使用抽象Akismet API的库。我们自己执行HTTP调用更有效率(并且允许我们从所有Symfony调试工具中受益,比如与Symfony Profiler的集成)。ob娱乐下载
设计一个垃圾邮件检查器类
下创建一个新类src /
命名SpamChecker
封装调用Akismet API并解释其响应的逻辑:
HTTP客户端请求()
方法将POST请求提交给Akismet URL ($ 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 \实体\评论;+使用Syob娱乐下载mfony \ DependencyInjection \属性\ \组件自动装配;使用Syob娱乐下载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
文件:
对于生产,应该定义一个“真正的”环境变量。
这工作得很好,但是管理许多环境变量可能会变得很麻烦。在这种情况下,Symfony在存ob娱乐下载储秘密方面有一个“更好”的选择。
存储秘密
而不是使用许多环境变量,Symfony可以管理一个ob娱乐下载库在那里你可以储存很多秘密。一个关键特性是能够在存储库中提交保险库(但没有打开它的密钥)。另一个伟大的特性是它可以管理每个环境的一个保险库。
秘密是环境变量的伪装。
在保险库中添加Akismet密钥:
1
$ob娱乐下载Symfony控制台的秘密:集AKISMET_KEY
1 2 3 4
> [OK] secret "AKISMET_KEY" encrypted in "config/secrets/dev/";你可以承诺。
因为这是我们第一次运行这个命令,它生成了两个键到/ dev / config /秘密
目录中。然后存储AKISMET_KEY
在同一目录下的秘密。
对于开发秘密,您可以决定提交在/ dev / config /秘密
目录中。
还可以通过设置同名的环境变量来覆盖秘密。
检查评论是否有垃圾邮件
当一个新的评论被提交时,一个简单的检查垃圾邮件的方法是在将数据存储到数据库之前调用垃圾邮件检查器:
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;控制器使ob娱乐下载用Symfony \包\ FrameworkBundle \ \ AbstractController;使用Syob娱乐下载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
$ob娱乐下载syob直播appmfony cloud:variable:create——sensitive=1——level=project -y——name=env:AKISMET_KEY——value=abcdef
但是如上所述,使用Symfony秘密可能更好。ob娱乐下载不是在安全方面,而是在项目团队的秘密管理方面。所有秘密都存储在存储库中,您需要为生产管理的唯一环境变量是解密密钥。这使得团队中的任何人都可以添加生产机密,即使他们没有访问生产服务器的权限。不过,设置有点复杂。
首先,生成一对用于生产的密钥:
1
$ob娱乐下载Symfony控制台秘密:generate-keys——env=prod
在Linux及类似操作系统下,请使用
APP_RUNTIME_ENV =刺激
而不是——env =刺激
类型的应用程序的编译刺激
环境:1
$APP_RUNTIME_ENV=prod ob娱乐下载symfony控制台秘密:生成密钥
在生产库中重新添加Akismet秘密,但保留其生产价值:
1
$ob娱乐下载Symfony控制台的秘密:集AKISMET_KEY - env =刺激
最后一步是通过设置一个敏感变量将解密密钥发送到Platform.sh:
1
$ob娱乐下载syob直播appmfony 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
要进一步