步骤16:防止使用API​​的垃圾邮件

5.2版本
保持 不明意
5.0

防止垃圾邮件与API

任何人都可以提交反馈意见。甚至机器人,垃圾邮件发送者和更多。我们可以将一些“CAPTCHA”添加到表单中以某种方式免受机器人的保护,或者我们可以使用一些第三方API。

我决定使用免费的Akismet.服务展示如何调用API以及如何使呼叫“出乐队”。

签署Akismet

注册免费帐户akismet.com并获取AkisMet API键。

根据Symfony Httob娱乐下载pclient组件

我们不会使用摘要Akismet API的库,而不是直接完成所有API调用。我们自己更高效地进行HTTP调用(并允许我们从与Symfony Profiler集成的所有Symfony调试工具中受益)。ob娱乐下载

要使API调用,请使用symfony httpclieob娱乐下载nt组件:

1
$ ob娱乐下载symfony composer req http-client

设计垃圾邮件检查课程

创建一个新的课程SRC /命名为垃圾录要包装调用AkisMet API并解释其响应的逻辑:

src / spamchecker.php.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 18 19 20 21 21 22 23 32 32 32 29 32 32 32 32 32 32 42 42 43 42 43 44 44 44 44 49 49 49 49 45 49 49 40
命名空间应用程序;app \ entity \评论;ob娱乐下载symfony \ contracts \ httpclient \ httpclientInterface;班级垃圾录{私人的$客户;私人的$端点;上市功能__构造httpclientInterface.$客户细绳$ akismetkey.{$这一点- >客户=$客户;$这一点- >终点=Sprintf.'https://%s.rest.akismet.com/1.1/comment-check'$ akismetkey.);}/ *** @return int垃圾邮件分数:0:不是垃圾邮件,1:也许垃圾邮件,2:公然垃圾邮件** @Throws \ Runtimeexception如果呼叫不起作用* /上市功能getSpamScore.评论$评论大批$ context.{$响应=$这一点- >客户- >要求'邮政'$这一点- >终点['身体'=>array_merge.$ context.['博客'=>'https:///guestbook.example.com''comment_type'=>'评论''comment_author'=>$评论- >getauthor.(),'comment_author_email'=>$评论- >GetMail.(),'comment_content'=>$评论- >GetText.(),'comment_date_gmt'=>$评论- >getcreatedat()- >格式'C'),'blog_lang'=>'en''blog_charset'=>'UTF-8''is_test'=>真的]),]);$标题=$响应- >Getheaders.();如果'丢弃'===.$标题['x-akismet-pro-tip'] [0.]''))){返回2;}$内容=$响应- >GetContent.();如果发行$标题['x-akismet-debug-help'] [0.])){新的\ runtimeexception.Sprintf.'无法检查垃圾邮件:%s(%s)。'$内容$标题['x-akismet-debug-help'] [0.]));}返回'真的'===.$内容10.;}}

HTTP客户端要求()方法将POST请求提交给AkisMet URL($ this->端点)并传递一系列参数。

getspamscore()方法根据API呼叫响应返回3个值:

  • 2:如果评论是“公然垃圾邮件”;
  • 1:如果评论可能是垃圾邮件;
  • 0.:如果评论不是垃圾邮件(火腿)。

小费

使用特殊akismet-guaranteed-spam@example.com.电子邮件地址强制呼叫结果为垃圾邮件。

使用环境变量

垃圾录课程依赖于$ akismetkey.争论。喜欢上传目录,我们可以通过a注入它捆绑容器设置:

patch_file.
1 2 3 4 5 6 7 8 9 10
--- a / config / services.yaml+++ b / config / services.yaml@@ -12,6 +12,7 @@服务:AutoConfigure:True#自动将服务注册为命令,事件订阅者等。绑定:$ photodir:“%kernel.project_dir%/ public /上传/ photos”+ $ akismetkey:“%env(akismet_key)%”#在SRC /可用的类中可以用作服务#这为每个类创建一个服务,其ID是完全限定的类名称

我们当然不想硬编码Akismet键的值服务.Yaml.配置文件,所以我们使用的环境变量(akismet_key.)。

然后,每个开发人员都可以设置“真实”环境变量或将值存储在一个.env.local.文件:

.env.local.
1
akismet_key = abcdef.

对于生产,应定义“真实”环境变量。

这很好,但管理许多环境变量可能会变得麻烦。在这种情况下,Symfony在谈ob娱乐下载到存储秘密时具有“更好”的替代品。

存储秘密

symfony可以管理一个ob娱乐下载拱顶在哪里可以存储许多秘密。一个关键功能是能够在存储库中提交Vault(但没有键打开它)。另一个很棒的功能是它可以管理每个环境的一个保险库。

秘密是伪装的环境变量。

在Vault中添加AkisMet键:

1
$ ob娱乐下载symfony控制台秘密:设置akismet_key
1 2 3 4
请输入秘密值:> [确定]秘密“akismet_key”以“config / secet / dev / dev /”加密;你可以提交它。

因为这是我们第一次运行此命令时,它会生成两个键进入配置/秘密/开发/目录。然后储存了akismet_key.在同一个目录中的秘密。

对于开发机密,您可以决定提交保险库和已生成的键配置/秘密/开发/目录。

也可以通过设置相同名称的环境变量来覆盖秘密。

检查垃圾邮件的评论

提交新注释时检查垃圾邮件的一个简单方法是在将数据存储到数据库之前调用垃圾邮件检查程序:

patch_file.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 18 19 20 21 22 21 22 23 23 32 32 32 32 32 32 32 32 32 32
--- a / src / controller / conferenceController.php+++ b / src / controller / conferenceController.php@@ -7,6 +7,7 @@使用app \ entity \会议;使用app \ form \ commencometype;使用app \ repository \ commentRepository;使用app \ repository \ conferencerepository;+使用app \ spamchecker;使用doctrine \ orm \ entityManagerInterface;使用syob娱乐下载mfony \ bundle \ frameworkbundle \ controller \ AbstractController;使用syob娱乐下载mfony \ component \ httpfoundation \ file \异常\ fileexception;@@ -35,7 +36,7 @@类ConferenceController扩展了AbstractController}#[路线('/ conference / {slug}',名称:'会议')]- 公共功能展示(请求$请求,会议$ equipty,CommentRepository $ CommentRepository,String $ Photodir):响应+公共功能展示(请求$请求,会议$ equipty,commentRepository $ CommentRepository,Spamchecker $ Spamchecker,String $ Photodir):响应{$评论=新的评论();$ form = $ this-> createform(commentformtype :: class,$评论);@@ -53,6 +54,17,17 @类ConferenceController扩展了抽象的控制器$以下 - > entityManager->持续存在($评论);++ $ context = [+'user_ip'=> $请求 - > getClientip(),+'user_agent'=> $请求 - >标题 - > get('用户 - 代理'),+'推荐人'=> $申请 - >标题 - > get('fearer'),+'permalink'=> $请求 - > geturi(),+];+ if(2 === $ spamchecker-> getspamscore($评论,$ context)){+投掷新\ runtimeexception('公然垃圾邮件,走开!');+}+$ this-> entitymanager-> flush();返回$ this-> redirecttoroute('conference',['slug'=> $ conference-> getslug()]);

检查它是否正常。

管理生产秘密

对于生产,SymfonyClouob娱乐下载d支持设置ob直播app敏感环境变量

1
$ ob娱乐下载symfony var:set  - 敏感akismet_key.=ABCDEF.

但如上所述,使用Symfony秘密可能会更好。ob娱乐下载不是在安全方面,但就项目团队的秘密管理而言。所有秘密都存储在存储库中,您需要管理生产的唯一环境变量是解密密钥。这使得团队中的任何人都可以添加生产机密,即使他们无法访问生产服务器。设置有点涉及。

首先,生成一对用于生产的键:

1
$app_env.=Prod ob娱乐下载Symfony控制台秘密:生成键

在生产库中重新添加Akismet秘密,但其生产价值:

1
$app_env.=Prod ob娱乐下载Symfony控制台秘密:设置Akismet_Key

最后一步是通过设置敏感变量将解密密钥发送到symfonycloud:ob娱乐下载ob直播app

1
$ ob娱乐下载symfony var:set  - 敏感ob娱乐下载symfony_decryption_secret.=`PHP -R.'echo base64_encode(包含(“config / secets / prod / prod.decrypt.private.php”));'`

您可以添加和提交所有文件;解密密钥已添加到中.gitignore.自动,所以它永远不会致力于。有关更多安全性,您可以将其从本地计算机中删除,因为它已立即部署:

1
$ rm -f config / secrets / prod / prod.decrypt.private.php

这项工作包括代码样本,是在a下获得的许可Creative Commons By-NC-SA 4.0执照。