Ochrona przed spamem przy pomocy API
Ochrona przed spamem przy pomocy API
卡兹迪·莫泽兹亚克opinię。机器人,该死的。mozemy dodak zabezpieczenie CAPTCHA do formularza, aby w jakiovic sposób ochronic się przed robot robot, mozemy te耶扎乌茨克zewnichtrznych API。
postanowieem skorzystac z darmowej ususugiAkismet, aby zademonstrowaic, jak wywowoak zapytanie做API i jak wykonak po华沙奇" poza widoczną warstwą "。
Rejestracja w Akismet
Zarejestruj bezpatne konto naakismet.comi uzyskaj klucz API Akismet。
zale佐夫维奇od komponentu Syob娱乐下载mfony HTTPClient
Zamiast korzystac z biblioteki, która obsutguje API Akismet, wykonamy wszystkie zapytania do API bezporednio。Wykonywanie zapytazynhttp samodzielnie jest bardziej efektywne (i pozwala nam korzystaic ze wszystkich narzyldob娱乐下载zi Symfony do debugowania, takich jak integracja z Symfony Profiler)。
Projektowanie klasy垃圾邮件检查器
Utwórz nową klasę w katalogusrc /
豆荚nazwąSpamChecker
w której zawrzemy schemat dziayakendpowiadajzycych za wyszanie zapytania do API Akismet i przetworzenie jego odpowiedzi。
Metoda请求()
klienta HTTP wysyja zapytanie POST pod URL Akismet ($ this - >端点
)我przekazuje tablicę parametrów。
MetodagetSpamScore ()
zwraca trzy wartowici w zaleenowici od odpowiedzi z API:
2
jeutli komentarz笑话“rawitzcym spamem”(ang。明目张胆的垃圾邮件);1
jeowli komentarz moze byk spamem;0
jeli komentarz nie jest spamem。
提示
uzyj specjalnego adresu电子邮件akismet-guaranteed-spam@example.com
,阿比·威尼克·威沃尼亚·波特拉克托瓦奇·贾科·斯帕姆。
Korzystanie ze zmiennych viktor dowiskowych
KlasaSpamChecker
Jest zaleovna od argumentuakismetKey美元
.Podobnie jak w przypadku katalogu do zapisu plików, mobemy wstrzyknibic ten argument za pomocą adnotacji自动装配
:
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);}
Z pewnością nie chcemy zapisywak na staee wartowicci klucza Akismet w kodzie, wiecic zamiast tego ujyyemy zmiennej trodowiskowej (AKISMET_KEY
).
nastzhepnie kazdy programista ustawia faktyczną zmienną środowiskową lub zapisuje jej wartowicc w pliku.env.local
:
W przypadku trodowiska produkcyjnego, nalevy zdefiniowak faktyczną zmienną środowiskową。
dziaaya to nieichle, ale zarzitzzzazzanie wieloma zmiennymi trodowiskowymi mozestac się ucizhezliwe。W takim przypadku ob娱乐下载Symfony pozwala lepiej rozwizhazak przechowywanie poufnych danych (ang。秘密)。
Przechowywanie poufnych danych(昂。秘密)
扎米亚斯特·乌泽瓦奇·威乌·兹米恩内奇·拉罗多维斯科维奇,塞弗尼·莫埃·扎扎兹扎克ob娱乐下载sejfem, w którym莫夫纳·普列佐维瓦克wiele poufnych danych。Jedną z kluczowych funkcji jest mozliwoovic zapisywania sejfu w repozytorium (jednak bez klucza do jego otwarcia)。Kolejną świetną cechą tego rozwizhezania jest to, zzzhezdzzac jednym sejfem w ramach jednego korodowiska。
Poufne dane są zamaskowanymi zmiennymi trodowiskowymi。
Dodaj klucz API Akismet do sejfu:
1
$ob娱乐下载Symfony控制台的秘密:集AKISMET_KEY
1 2 3 4
> [OK] secret "AKISMET_KEY" encrypted in "config/secrets/dev/";你可以承诺。
波尼瓦耶扎鲁查米米到polecenie po raz pierwszy, w katalogu/ dev / config /秘密
pojawiy się dwa klucze。nastzhepnie w tym samym katalogu zostaava zapisanyAKISMET_KEY
.
Podczas prac w rorodowisku deweloperskim, moesesz zdecydowak się na zapisanie w repozytorium sejfu oraz kluczy, które zostayy wygenerowane w katalogu/ dev / config /秘密
.
瓦尔托维奇poufnych danych mogą拜奇nadpisane ustawieniem zmiennej korodowiskowej o tej samej nazwie。
Sprawdzanie komentarzy pod kumbtem spamu
Podczas wysyzyania nowego komentarza, prostym sposobem na sprawzenie, czy nie jest on spamem, jest wykorzystanie obiektu klasySpamChecker
赞美zapisaniem danych做bazy danych:
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()]);
从sprawd,到czy dobrze。
zarzazzanie poufnymi danymi w wurrodowisku produkcyjnym
wutrodowisku produkcyjnym, Platform.sh obsutguje ustawianiePoufnych zmiennych korodowiskowych:
1
$ob娱乐下载syob直播appmfony cloud:variable:create——sensitive=1——level=project -y——name=env:AKISMET_KEY——value=abcdef
Ale jak wspomniano powyzej, uzecie sejfu przechowujcego poufne dane moze byk lepsze。Nie zwieksza bezpieczezynstwa, ale uutatwia zarzannizzzzdanie nimi w zespole projektown。Wszystkie poufne dane są przechowywane w repozytorium, a jedyną zmienną środowiskową, o którą musisz zadbaic w wurrodowisku produkcyjnym, jest klucz odszyfrowujcy。dzizhaki temu kazdy w zespole mozve dodak poufne dane, nawet jeutli nie ma dostylpu do serwerów produkcyjnych。konfigacja jednak nieco bardziej skomplikowana。
Po pierwsze, wygeneruj parę kluczy do uzytku produkcyjnego:
1
$ob娱乐下载Symfony控制台秘密:generate-keys——env=prod
在Linux及类似操作系统下,请使用
APP_RUNTIME_ENV =刺激
而不是——env =刺激
类型的应用程序的编译刺激
环境:1
$APP_RUNTIME_ENV=prod ob娱乐下载symfony控制台秘密:生成密钥
Ponownie wprowadwindoklucz do API Akismet w sejfie produkcyjnym, ale z wartością dla trodowiska produkcyjnego:
1
$ob娱乐下载Symfony控制台的秘密:集AKISMET_KEY - env =刺激
Ostatnim krokiem jest wysyanie klucza odszyfrowujcego do Platform.sh poprzez ustawienie poufnej zmiennej:
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”));”`
moesz dodawaic i zatwierdzac(昂。Commit) w repozytorium wszystkie pliki;Klucz odszyfrowujagicy zostakovsky dodany做.gitignore
Automatycznie, wijicknigdy nie zostanie w nim zatwierdzony。Dla wiuykszego bezpieczezynstwa moutna go usunizhic z maszyny lokalnej,波尼瓦耶佐夫斯塔拉·朱耶佐夫云图SymfonyCloob娱乐下载ud:ob直播app
1
$Rm -f config/secrets/prod/prod.decrypt.private.php