{"id":101519,"date":"2025-03-14T16:43:41","date_gmt":"2025-03-14T13:13:41","guid":{"rendered":"https:\/\/nabfollower.com\/blog\/%d8%aa%da%a9%d9%86%db%8c%da%a9-%d9%87%d8%a7%db%8c-%d9%be%db%8c%d8%b4%d8%b1%d9%81%d8%aa%d9%87-%d8%ad%d9%85%d9%84%d9%87-%d9%88-%d9%be%db%8c%d8%b4%da%af%db%8c%d8%b1%db%8c-%d8%a7%d8%b2-%d9%86%db%8c%d8%b1\/"},"modified":"2025-03-14T16:43:41","modified_gmt":"2025-03-14T13:13:41","slug":"%d8%aa%da%a9%d9%86%db%8c%da%a9-%d9%87%d8%a7%db%8c-%d9%be%db%8c%d8%b4%d8%b1%d9%81%d8%aa%d9%87-%d8%ad%d9%85%d9%84%d9%87-%d9%88-%d9%be%db%8c%d8%b4%da%af%db%8c%d8%b1%db%8c-%d8%a7%d8%b2-%d9%86%db%8c%d8%b1","status":"publish","type":"post","link":"https:\/\/nabfollower.com\/blog\/%d8%aa%da%a9%d9%86%db%8c%da%a9-%d9%87%d8%a7%db%8c-%d9%be%db%8c%d8%b4%d8%b1%d9%81%d8%aa%d9%87-%d8%ad%d9%85%d9%84%d9%87-%d9%88-%d9%be%db%8c%d8%b4%da%af%db%8c%d8%b1%db%8c-%d8%a7%d8%b2-%d9%86%db%8c%d8%b1\/","title":{"rendered":"\u062a\u06a9\u0646\u06cc\u06a9 \u0647\u0627\u06cc \u067e\u06cc\u0634\u0631\u0641\u062a\u0647 \u062d\u0645\u0644\u0647 \u0648 \u067e\u06cc\u0634\u06af\u06cc\u0631\u06cc \u0627\u0632 \u0646\u06cc\u0631\u0648\u06cc \u0648\u062d\u0634\u06cc\u0627\u0646\u0647 Nestjs"},"content":{"rendered":"<div data-article-id=\"2332858\" id=\"article-body\">\n<h2>\n<p>  \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<br \/>\n<\/h2>\n<ul>\n<li>\u062f\u0631\u06a9 \u062d\u0645\u0644\u0627\u062a \u0628\u06cc \u0631\u062d\u0645\u0627\u0646\u0647<\/li>\n<li>\u062a\u06a9\u0646\u06cc\u06a9 \u0647\u0627\u06cc \u067e\u06cc\u0634\u0631\u0641\u062a\u0647 \u0628\u0631\u0627\u06cc \u062c\u0644\u0648\u06af\u06cc\u0631\u06cc \u0627\u0632 \u062d\u0645\u0644\u0627\u062a \u0646\u06cc\u0631\u0648\u06cc \u0628\u06cc \u0631\u062d\u0645\u0627\u0646\u0647<\/li>\n<li>\u062a\u0646\u0638\u06cc\u0645 \u0645\u062d\u062f\u0648\u062f \u06a9\u0631\u062f\u0646 \u0646\u0631\u062e<\/li>\n<li>\u0627\u062c\u0631\u0627\u06cc \u0642\u0641\u0644 \u062d\u0633\u0627\u0628<\/li>\n<li>\u0627\u0641\u0632\u0648\u062f\u0646 \u062a\u0623\u06cc\u06cc\u062f Captcha<\/li>\n<li>\u0645\u0633\u062f\u0648\u062f \u06a9\u0631\u062f\u0646 IP \u0647\u0627\u06cc \u0645\u0634\u06a9\u0648\u06a9<\/li>\n<li>\u0628\u0647\u062a\u0631\u06cc\u0646 \u0631\u0648\u0634\u0647\u0627<\/li>\n<li>\u067e\u0627\u06cc\u0627\u0646<\/li>\n<\/ul>\n<hr\/>\n<p>\u062d\u0645\u0644\u0627\u062a \u0646\u06cc\u0631\u0648\u06cc \u0628\u06cc \u0631\u062d\u0645\u0627\u0646\u0647 \u06cc\u06a9 \u062a\u0647\u062f\u06cc\u062f \u0627\u0645\u0646\u06cc\u062a\u06cc \u0645\u0634\u062a\u0631\u06a9 \u0627\u0633\u062a \u06a9\u0647 \u062f\u0631 \u0622\u0646 \u06cc\u06a9 \u0645\u0647\u0627\u062c\u0645 \u0628\u0627 \u062a\u0644\u0627\u0634 \u0628\u0631\u0627\u06cc \u062a\u0631\u06a9\u06cc\u0628 \u0647\u0627\u06cc \u0646\u0627\u0645 \u06a9\u0627\u0631\u0628\u0631\u06cc\/\u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u060c \u0633\u0639\u06cc \u062f\u0631 \u062f\u0633\u062a\u06cc\u0627\u0628\u06cc \u063a\u06cc\u0631\u0645\u062c\u0627\u0632 \u0628\u0647 \u06cc\u06a9 \u0633\u06cc\u0633\u062a\u0645 \u062f\u0627\u0631\u062f. \u0645\u0647\u0627\u062c\u0645 \u0628\u0647 \u0637\u0648\u0631 \u0633\u06cc\u0633\u062a\u0645\u0627\u062a\u06cc\u06a9 \u062a\u0645\u0627\u0645 \u062a\u0631\u06a9\u06cc\u0628\u0627\u062a \u0645\u0645\u06a9\u0646 \u0627\u0632 \u0627\u0639\u062a\u0628\u0627\u0631 \u0631\u0627 \u062a\u0627 \u0632\u0645\u0627\u0646\u06cc \u06a9\u0647 \u0635\u062d\u06cc\u062d \u067e\u06cc\u062f\u0627 \u0646\u0634\u0648\u062f \u060c \u0627\u0645\u062a\u062d\u0627\u0646 \u0645\u06cc \u06a9\u0646\u062f. \u0627\u06cc\u0646 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u0628\u0647 \u062f\u0633\u062a\u0631\u0633\u06cc \u063a\u06cc\u0631\u0645\u062c\u0627\u0632 \u060c \u0646\u0642\u0636 \u062f\u0627\u062f\u0647 \u0647\u0627 \u0648 \u0633\u0627\u06cc\u0631 \u0645\u0633\u0627\u0626\u0644 \u0627\u0645\u0646\u06cc\u062a\u06cc \u0645\u0646\u062c\u0631 \u0634\u0648\u062f. \u0628\u0631\u0627\u06cc \u062c\u0644\u0648\u06af\u06cc\u0631\u06cc \u0627\u0632 \u0686\u0646\u06cc\u0646 \u062d\u0645\u0644\u0627\u062a\u06cc \u060c \u0628\u0627\u06cc\u062f \u0686\u0646\u062f\u06cc\u0646 \u0644\u0627\u06cc\u0647 \u062f\u0641\u0627\u0639 \u0631\u0627 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u06a9\u0646\u06cc\u062f.<\/p>\n<p>\u0627\u06cc\u0646 \u0645\u0642\u0627\u0644\u0647 \u0634\u0645\u0627 \u0631\u0627 \u0627\u0632 \u0637\u0631\u06cc\u0642 \u062a\u06a9\u0646\u06cc\u06a9 \u0647\u0627\u06cc \u067e\u06cc\u0634\u0631\u0641\u062a\u0647 \u0628\u0631\u0627\u06cc \u06a9\u0627\u0647\u0634 \u062d\u0645\u0644\u0627\u062a \u0646\u06cc\u0631\u0648\u06cc \u0628\u06cc \u0631\u062d\u0645\u0627\u0646\u0647 \u060c \u0627\u0632 \u062c\u0645\u0644\u0647 \u0645\u062d\u062f\u0648\u062f \u06a9\u0631\u062f\u0646 \u0646\u0631\u062e \u060c \u0645\u06a9\u0627\u0646\u06cc\u0633\u0645 \u0647\u0627\u06cc \u0642\u0641\u0644 \u062d\u0633\u0627\u0628 \u0648 \u0627\u062f\u063a\u0627\u0645 Captcha \u062f\u0631 Nestjs \u0631\u0627\u0647\u0646\u0645\u0627\u06cc\u06cc \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p><strong>\u062f\u0631\u06a9 \u062d\u0645\u0644\u0627\u062a \u0628\u06cc \u0631\u062d\u0645\u0627\u0646\u0647<\/strong><\/p>\n<p>\u06cc\u06a9 \u067e\u0644\u062a\u0641\u0631\u0645 \u0645\u062d\u0628\u0648\u0628 \u0628\u0627\u0646\u06a9\u06cc \u0622\u0646\u0644\u0627\u06cc\u0646 \u060c &#8220;SecureBank&#8221; \u0631\u0627 \u062a\u0635\u0648\u0631 \u06a9\u0646\u06cc\u062f \u06a9\u0647 \u0628\u0647 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0627\u0645\u06a9\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0622\u062f\u0631\u0633 \u0647\u0627\u06cc \u0627\u06cc\u0645\u06cc\u0644 \u0648 \u0631\u0645\u0632\u0647\u0627\u06cc \u0639\u0628\u0648\u0631 \u062e\u0648\u062f \u0648\u0627\u0631\u062f \u0633\u06cc\u0633\u062a\u0645 \u0634\u0648\u0646\u062f. \u0627\u06cc\u0646 \u067e\u0644\u062a\u0641\u0631\u0645 \u0647\u0632\u0627\u0631\u0627\u0646 \u06a9\u0627\u0631\u0628\u0631 \u0627\u0632 \u062c\u0645\u0644\u0647 \u0627\u0641\u0631\u0627\u062f \u0648 \u0645\u0634\u0627\u063a\u0644 \u062f\u0627\u0631\u062f \u06a9\u0647 \u0628\u0631\u0627\u06cc \u0645\u062f\u06cc\u0631\u06cc\u062a \u0627\u0645\u0648\u0631 \u0645\u0627\u0644\u06cc \u062e\u0648\u062f \u0628\u0647 \u0622\u0646 \u0627\u0639\u062a\u0645\u0627\u062f \u0645\u06cc \u06a9\u0646\u0646\u062f. \u0645\u062a\u0623\u0633\u0641\u0627\u0646\u0647 \u060c \u0633\u06cc\u0633\u062a\u0645 \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 SecureBank \u062f\u0627\u0631\u0627\u06cc \u0646\u0642\u0635 \u0645\u0647\u0645\u06cc \u0627\u0633\u062a: \u0627\u06cc\u0646 \u0645\u06a9\u0627\u0646\u06cc\u0632\u0645 \u0631\u0627 \u0628\u0631\u0627\u06cc \u062c\u0644\u0648\u06af\u06cc\u0631\u06cc \u0627\u0632 \u062a\u0644\u0627\u0634 \u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641 \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 \u0627\u062c\u0631\u0627 \u0646\u0645\u06cc \u06a9\u0646\u062f. \u0627\u06cc\u0646 \u0646\u0638\u0627\u0631\u062a \u0622\u0646 \u0631\u0627 \u0628\u0647 \u06cc\u06a9 \u0647\u062f\u0641 \u0622\u0633\u0627\u0646 \u0628\u0631\u0627\u06cc \u062d\u0645\u0644\u0627\u062a \u0646\u06cc\u0631\u0648\u06cc \u0628\u06cc \u0631\u062d\u0645\u0627\u0646\u0647 \u062a\u0628\u062f\u06cc\u0644 \u0645\u06cc \u06a9\u0646\u062f.<\/p>\n<p>\u0645\u0647\u0627\u062c\u0645 \u060c \u06cc\u06a9 \u0641\u0631\u062f \u0645\u062e\u0631\u0628 \u0628\u0627 \u0645\u0647\u0627\u0631\u062a \u0647\u0627\u06cc \u0627\u0635\u0644\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0646\u0648\u06cc\u0633\u06cc \u060c \u0635\u0641\u062d\u0647 \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 SecureBank \u0631\u0627 \u062f\u0631 \u06a9\u0634\u0641 \u0645\u06cc \u06a9\u0646\u062f <code>https:\/\/securebank.com\/login<\/code>\u0628\u0634\u0631 \u0627\u06cc\u0646 \u0635\u0641\u062d\u0647 \u0628\u0631\u0627\u06cc \u062f\u0633\u062a\u0631\u0633\u06cc \u0628\u0647 \u0646\u0627\u0645 \u06a9\u0627\u0631\u0628\u0631\u06cc (\u0627\u06cc\u0645\u06cc\u0644) \u0648 \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u0646\u06cc\u0627\u0632 \u062f\u0627\u0631\u062f. \u0647\u062f\u0641 \u0645\u0647\u0627\u062c\u0645 \u062f\u0633\u062a\u06cc\u0627\u0628\u06cc \u0628\u0647 \u062f\u0633\u062a\u0631\u0633\u06cc \u063a\u06cc\u0631\u0645\u062c\u0627\u0632 \u0628\u0647 \u062d\u0633\u0627\u0628 \u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631\u06cc \u060c \u0628\u0647 \u0648\u06cc\u0698\u0647 \u0645\u0648\u0627\u0631\u062f\u06cc \u0627\u0633\u062a \u06a9\u0647 \u062f\u0627\u0631\u0627\u06cc \u0645\u0627\u0646\u062f\u0647 \u0647\u0627\u06cc \u0628\u0627\u0644\u0627 \u06cc\u0627 \u0627\u0645\u062a\u06cc\u0627\u0632\u0627\u062a \u0627\u062f\u0627\u0631\u06cc \u0627\u0633\u062a.<\/p>\n<p>\u0645\u0647\u0627\u062c\u0645 \u0647\u0645\u0686\u0646\u06cc\u0646 \u0644\u06cc\u0633\u062a\u06cc \u0627\u0632 \u0622\u062f\u0631\u0633 \u0647\u0627\u06cc \u0627\u06cc\u0645\u06cc\u0644 \u0645\u0634\u062a\u0631\u06a9 (\u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062b\u0627\u0644 \u060c \u0627\u0632 \u0646\u0642\u0636 \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u0642\u0628\u0644\u06cc) \u0648 \u06cc\u06a9 \u0641\u0631\u0647\u0646\u06af \u0644\u063a\u062a \u0631\u0645\u0632\u0647\u0627\u06cc \u0639\u0628\u0648\u0631 \u0645\u06a9\u0631\u0631 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc \u06a9\u0646\u062f (\u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062b\u0627\u0644 \u060c &#8220;Password123&#8221; \u060c &#8220;Admin123&#8221; \u060c &#8220;12345678&#8221;).<\/p>\n<p>\u0645\u0647\u0627\u062c\u0645 \u06cc\u06a9 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0633\u0627\u062f\u0647 \u067e\u0627\u06cc\u062a\u0648\u0646 \u0631\u0627 \u0628\u0631\u0627\u06cc \u062e\u0648\u062f\u06a9\u0627\u0631 \u0633\u0627\u0632\u06cc \u062a\u0644\u0627\u0634 \u0647\u0627\u06cc \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 \u0645\u06cc \u0646\u0648\u06cc\u0633\u062f. \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0622\u062f\u0631\u0633 \u0647\u0627\u06cc \u0627\u06cc\u0645\u06cc\u0644 \u0648 \u0631\u0645\u0632\u0647\u0627\u06cc \u0639\u0628\u0648\u0631 \u0631\u0627 \u0627\u0632 \u0644\u06cc\u0633\u062a \u0647\u0627\u06cc \u0622\u0645\u0627\u062f\u0647 \u0645\u06cc \u062e\u0648\u0627\u0646\u062f \u0648 \u0622\u0646\u0647\u0627 \u0631\u0627 \u0628\u0647 \u0646\u0642\u0637\u0647 \u067e\u0627\u06cc\u0627\u0646\u06cc \u0648\u0631\u0648\u062f \u0645\u06cc \u0641\u0631\u0633\u062a\u062f. \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0641\u06cc\u0644\u0645\u0646\u0627\u0645\u0647 \u0628\u0647 \u0646\u0638\u0631 \u0645\u06cc \u0631\u0633\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>import requests\n\n# List of common email addresses and passwords\nemails = [\"user1@example.com\", \"user2@example.com\", \"admin@securebank.com\"]\npasswords = [\"password123\", \"admin123\", \"12345678\", \"qwerty\"]\n\n# Target login endpoint\nlogin_url = \"https:\/\/securebank.com\/login\"\n\n# Launch the brute force attack\nfor email in emails:\n    for password in passwords:\n        payload = {\n            \"email\": email,\n            \"password\": password\n        }\n        response = requests.post(login_url, data=payload)\n\n        if \"Login successful\" in response.text:\n            print(f\"Success! Email: {email}, Password: {password}\")\n            break\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0645\u0647\u0627\u062c\u0645 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0631\u0627 \u0627\u062c\u0631\u0627 \u0645\u06cc \u06a9\u0646\u062f \u060c \u06a9\u0647 \u0634\u0631\u0648\u0639 \u0628\u0647 \u0627\u0631\u0633\u0627\u0644 \u0647\u0632\u0627\u0631\u0627\u0646 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 \u0628\u0631\u0627\u06cc \u0627\u0645\u0646\u06cc\u062a \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 \u0645\u06cc \u06a9\u0646\u062f. \u0647\u0631 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u062a\u0631\u06a9\u06cc\u0628\u06cc \u0645\u062a\u0641\u0627\u0648\u062a \u0627\u0632 \u0627\u06cc\u0645\u06cc\u0644 \u0648 \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u0631\u0627 \u0627\u0645\u062a\u062d\u0627\u0646 \u0645\u06cc \u06a9\u0646\u062f. \u0627\u0632 \u0622\u0646\u062c\u0627 \u06a9\u0647 \u0647\u06cc\u0686 \u0645\u062d\u062f\u0648\u062f\u06cc\u062a\u06cc \u062f\u0631 \u0645\u0648\u0631\u062f \u062a\u0639\u062f\u0627\u062f \u062a\u0644\u0627\u0634 \u0647\u0627 \u0648\u062c\u0648\u062f \u0646\u062f\u0627\u0631\u062f \u060c \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u0628\u0647 \u0637\u0648\u0631 \u0646\u0627\u0645\u062d\u062f\u0648\u062f \u0627\u062c\u0631\u0627 \u0634\u0648\u062f \u062a\u0627 \u0632\u0645\u0627\u0646\u06cc \u06a9\u0647 \u06cc\u06a9 \u062a\u0631\u06a9\u06cc\u0628 \u0645\u0639\u062a\u0628\u0631 \u067e\u06cc\u062f\u0627 \u06a9\u0646\u062f.<\/p>\n<p>\u067e\u0633 \u0627\u0632 \u0686\u0646\u062f \u0633\u0627\u0639\u062a \u060c \u0641\u06cc\u0644\u0645\u0646\u0627\u0645\u0647 \u0628\u0627 \u0645\u0648\u0641\u0642\u06cc\u062a \u0628\u0627 \u0627\u0639\u062a\u0628\u0627\u0631 \u0632\u06cc\u0631 \u0648\u0627\u0631\u062f \u0645\u06cc \u0634\u0648\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>Email: admin@securebank.com\n\nPassword: admin123\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0645\u0647\u0627\u062c\u0645 \u0627\u06a9\u0646\u0648\u0646 \u0628\u0647 \u062d\u0633\u0627\u0628 \u0645\u062f\u06cc\u0631 \u062f\u0633\u062a\u0631\u0633\u06cc \u062f\u0627\u0631\u062f \u060c \u06a9\u0647 \u0628\u0647 \u0622\u0646\u0647\u0627 \u06a9\u0646\u062a\u0631\u0644 \u06a9\u0627\u0645\u0644 \u0628\u0631 \u0631\u0648\u06cc \u0633\u06a9\u0648\u06cc \u0628\u0627\u0646\u06a9\u06cc \u0627\u0639\u0637\u0627 \u0645\u06cc \u06a9\u0646\u062f. \u0622\u0646\u0647\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646\u0646\u062f \u0648\u062c\u0648\u0647 \u0631\u0627 \u0645\u0646\u062a\u0642\u0644 \u06a9\u0646\u0646\u062f \u060c \u062f\u0627\u062f\u0647 \u0647\u0627\u06cc \u062d\u0633\u0627\u0633 \u0645\u0634\u062a\u0631\u06cc \u0631\u0627 \u0633\u0631\u0642\u062a \u06a9\u0646\u0646\u062f \u06cc\u0627 \u062d\u062a\u06cc \u06a9\u0627\u0631\u0628\u0631\u0627\u0646 \u0645\u0634\u0631\u0648\u0639 \u0631\u0627 \u0627\u0632 \u062d\u0633\u0627\u0628 \u062e\u0648\u062f \u0642\u0641\u0644 \u06a9\u0646\u0646\u062f.<\/p>\n<p><strong>\u062a\u06a9\u0646\u06cc\u06a9 \u0647\u0627\u06cc \u067e\u06cc\u0634\u0631\u0641\u062a\u0647 \u0628\u0631\u0627\u06cc \u062c\u0644\u0648\u06af\u06cc\u0631\u06cc \u0627\u0632 \u062d\u0645\u0644\u0627\u062a \u0646\u06cc\u0631\u0648\u06cc \u0628\u06cc \u0631\u062d\u0645\u0627\u0646\u0647<\/strong><\/p>\n<p>\u0627\u0644\u0641 <strong>\u0645\u062d\u062f\u0648\u062f \u06a9\u0631\u062f\u0646 \u0646\u0631\u062e<\/strong><br \/>\u0645\u062d\u062f\u0648\u062f \u06a9\u0631\u062f\u0646 \u0646\u0631\u062e \u062a\u0639\u062f\u0627\u062f \u062f\u0631\u062e\u0648\u0627\u0633\u062a\u0647\u0627\u06cc\u06cc \u0631\u0627 \u06a9\u0647 \u06a9\u0627\u0631\u0628\u0631 \u0645\u06cc \u062a\u0648\u0627\u0646\u062f \u062f\u0631 \u06cc\u06a9 \u0628\u0627\u0632\u0647 \u0632\u0645\u0627\u0646\u06cc \u062e\u0627\u0635 \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u062f \u0645\u062d\u062f\u0648\u062f \u0645\u06cc \u06a9\u0646\u062f. \u0627\u06cc\u0646 \u0627\u0645\u0631 \u0645\u0627\u0646\u0639 \u0627\u0632 \u0627\u06cc\u0646 \u0645\u06cc \u0634\u0648\u062f \u06a9\u0647 \u0645\u0647\u0627\u062c\u0645\u0627\u0646 \u062f\u0631 \u06cc\u06a9 \u062f\u0648\u0631\u0647 \u06a9\u0648\u062a\u0627\u0647 \u062a\u0644\u0627\u0634 \u0647\u0627\u06cc \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 \u0628\u06cc\u0634 \u0627\u0632 \u062d\u062f \u0627\u0646\u062c\u0627\u0645 \u062f\u0647\u0646\u062f.<\/p>\n<p>Nestjs \u06cc\u06a9 \u0631\u0648\u0634 \u0627\u0646\u0639\u0637\u0627\u0641 \u067e\u0630\u06cc\u0631 \u0628\u0631\u0627\u06cc \u0627\u062c\u0631\u0627\u06cc \u0645\u062d\u062f\u0648\u062f\u06cc\u062a \u0646\u0631\u062e \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 <code>@nestjs\/throttler<\/code> \u0628\u0633\u062a\u0647 \u0628\u0646\u062f\u06cc<\/p>\n<p>\u0648\u0627\u0628\u0633\u062a\u06af\u06cc \u0647\u0627 \u0631\u0627 \u0646\u0635\u0628 \u06a9\u0646\u06cc\u062f<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>npm install @nestjs\/throttler\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc Throttlermodule<br \/>\u062f\u0631 \u0634\u0645\u0627 <code>app.module.ts<\/code>\u060c Throttlermodule \u0631\u0627 \u067e\u06cc\u06a9\u0631\u0628\u0646\u062f\u06cc \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>import { ThrottlerModule } from '@nestjs\/throttler';\n\n@Module({\n  imports: [\n    ThrottlerModule.forRoot({\n      ttl: 60, \/\/ Time-to-live in seconds\n      limit: 10, \/\/ Maximum number of requests within TTL\n    }),\n  ],\n})\nexport class AppModule {}\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0645\u062d\u062f\u0648\u062f \u06a9\u0631\u062f\u0646 \u0646\u0631\u062e \u0631\u0627 \u062f\u0631 \u0645\u0633\u06cc\u0631\u0647\u0627 \u0627\u0639\u0645\u0627\u0644 \u06a9\u0646\u06cc\u062f<br \/>\u0627\u0632 \u062f\u06a9\u0648\u0631\u0627\u062a\u0648\u0631 throttle () \u0628\u0631\u0627\u06cc \u0627\u0639\u0645\u0627\u0644 \u0645\u062d\u062f\u0648\u062f \u06a9\u0631\u062f\u0646 \u0646\u0631\u062e \u062f\u0631 \u0645\u0633\u06cc\u0631\u0647\u0627\u06cc \u062e\u0627\u0635 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>import { Throttle } from '@nestjs\/throttler';\n\n@Controller('auth')\nexport class AuthController {\n  @Throttle(5, 60) \/\/ 5 requests per 60 seconds\n  @Post('login')\n  async login(@Body() credentials: any) {\n    \/\/ Login logic\n  }\n}\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0628. <strong>\u0645\u06a9\u0627\u0646\u06cc\u0633\u0645 \u0642\u0641\u0644 \u062d\u0633\u0627\u0628<\/strong><br \/>\u067e\u0633 \u0627\u0632 \u062a\u0639\u062f\u0627\u062f \u0645\u0634\u062e\u0635\u06cc \u0627\u0632 \u062a\u0644\u0627\u0634 \u0647\u0627\u06cc \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 \u060c \u062d\u0633\u0627\u0628 \u0628\u0647 \u0637\u0648\u0631 \u0645\u0648\u0642\u062a \u0642\u0641\u0644 \u0645\u06cc \u0634\u0648\u062f. \u0627\u06cc\u0646 \u062d\u0645\u0644\u0627\u062a \u0646\u06cc\u0631\u0648\u06cc \u0628\u06cc \u0631\u062d\u0645\u0627\u0646\u0647 \u0631\u0627 \u06a9\u0646\u062f \u0645\u06cc \u06a9\u0646\u062f \u0648 \u06a9\u0627\u0631\u0628\u0631 \u0631\u0627 \u0627\u0632 \u0641\u0639\u0627\u0644\u06cc\u062a \u0645\u0634\u06a9\u0648\u06a9 \u0647\u0634\u062f\u0627\u0631 \u0645\u06cc \u062f\u0647\u062f.<\/p>\n<p>\u062a\u0644\u0627\u0634 \u0628\u0631\u0627\u06cc \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 \u0646\u0627\u0645\u0648\u0641\u0642 \u0627\u0633\u062a<br \/>\u062a\u0639\u062f\u0627\u062f \u062a\u0644\u0627\u0634 \u0647\u0627\u06cc \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 \u0646\u0627\u0645\u0648\u0641\u0642 \u0631\u0627 \u062f\u0631 \u067e\u0627\u06cc\u06af\u0627\u0647 \u062f\u0627\u062f\u0647 \u06cc\u0627 \u06cc\u06a9 \u0641\u0631\u0648\u0634\u06af\u0627\u0647 \u062d\u0627\u0641\u0638\u0647 \u0645\u0627\u0646\u0646\u062f Redis \u0630\u062e\u06cc\u0631\u0647 \u06a9\u0646\u06cc\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>import { Injectable } from '@nestjs\/common';\nimport { InjectRepository } from '@nestjs\/typeorm';\nimport { Repository } from 'typeorm';\nimport { User } from '.\/user.entity';\n\n@Injectable()\nexport class AuthService {\n  constructor(\n    @InjectRepository(User)\n    private userRepository: Repository<user>,\n  ) {}\n\n  async incrementFailedAttempts(userId: number): Promise<void> {\n    const user = await this.userRepository.findOne({ where: { id: userId } });\n    user.failedAttempts += 1;\n    await this.userRepository.save(user);\n  }\n\n  async resetFailedAttempts(userId: number): Promise<void> {\n    const user = await this.userRepository.findOne({ where: { id: userId } });\n    user.failedAttempts = 0;\n    await this.userRepository.save(user);\n  }\n\n  async isAccountLocked(userId: number): Promise<boolean> {\n    const user = await this.userRepository.findOne({ where: { id: userId } });\n    return user.failedAttempts &gt;= 5; \/\/ Lock after 5 failed attempts\n  }\n}\n<\/boolean><\/void><\/void><\/user><\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u062d\u0633\u0627\u0628 \u0642\u0641\u0644 \u067e\u0633 \u0627\u0632 \u062a\u0644\u0627\u0634 \u0647\u0627\u06cc \u0646\u0627\u06a9\u0627\u0645 \u0628\u06cc\u0634 \u0627\u0632 \u062d\u062f<br \/>\u062f\u0631 \u0645\u0646\u0637\u0642 \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 \u060c \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u062f \u06a9\u0647 \u0622\u06cc\u0627 \u062d\u0633\u0627\u0628 \u0642\u0641\u0644 \u0634\u062f\u0647 \u0627\u0633\u062a:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>@Post('login')\nasync login(@Body() credentials: any) {\n  const user = await this.authService.validateUser(credentials);\n  if (!user) {\n    await this.authService.incrementFailedAttempts(user.id);\n    throw new UnauthorizedException('Invalid credentials');\n  }\n\n  if (await this.authService.isAccountLocked(user.id)) {\n    throw new UnauthorizedException('Account locked due to too many failed attempts');\n  }\n\n  await this.authService.resetFailedAttempts(user.id);\n  \/\/ Proceed with login\n}\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u062c. <strong>\u0627\u062f\u063a\u0627\u0645 \u06a9\u0627\u067e\u0686\u0627<\/strong><br \/>\u0686\u0627\u0644\u0634 \u0647\u0627\u06cc Captcha \u0627\u0637\u0645\u06cc\u0646\u0627\u0646 \u062d\u0627\u0635\u0644 \u0645\u06cc \u06a9\u0646\u062f \u06a9\u0647 \u062a\u0644\u0627\u0634 \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 \u062a\u0648\u0633\u0637 \u06cc\u06a9 \u0627\u0646\u0633\u0627\u0646 \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc \u0634\u0648\u062f \u0648 \u0646\u0647 \u06cc\u06a9 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u062e\u0648\u062f\u06a9\u0627\u0631.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>import axios from 'axios';\n\n@Post('login')\nasync login(@Body() credentials: any) {\n  const captchaResponse = await axios.post(\n    `https:\/\/www.google.com\/recaptcha\/api\/siteverify?secret=${process.env.RECAPTCHA_SECRET}&amp;response=${credentials.captcha}`,\n  );\n\n  if (!captchaResponse.data.success) {\n    throw new UnauthorizedException('CAPTCHA verification failed');\n  }\n\n  \/\/ Proceed with login\n}\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u062f. <strong>\u0645\u0633\u062f\u0648\u062f \u06a9\u0646\u0646\u062f\u0647 IP<\/strong><br \/>\u0645\u0633\u062f\u0648\u062f \u06a9\u0631\u062f\u0646 \u0622\u062f\u0631\u0633 \u0647\u0627\u06cc IP \u06a9\u0647 \u0631\u0641\u062a\u0627\u0631 \u0645\u0634\u06a9\u0648\u06a9 \u0631\u0627 \u0646\u0634\u0627\u0646 \u0645\u06cc \u062f\u0647\u0646\u062f (\u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062b\u0627\u0644 \u060c \u0628\u0633\u06cc\u0627\u0631\u06cc \u0627\u0632 \u062a\u0644\u0627\u0634 \u0647\u0627\u06cc \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645) \u0645\u06cc \u062a\u0648\u0627\u0646\u0646\u062f \u0628\u0647 \u0637\u0648\u0631 \u0645\u0624\u062b\u0631 \u062d\u0645\u0644\u0627\u062a \u0646\u06cc\u0631\u0648\u06cc \u0628\u06cc \u0631\u062d\u0645\u0627\u0646\u0647 \u0631\u0627 \u06a9\u0627\u0647\u0634 \u062f\u0647\u0646\u062f.<\/p>\n<p>IP \u0647\u0627 \u0631\u0627 \u0628\u0627 \u062a\u0644\u0627\u0634 \u0647\u0627\u06cc \u0646\u0627\u0645\u0648\u0641\u0642 \u067e\u06cc\u06af\u06cc\u0631\u06cc \u06a9\u0646\u06cc\u062f<br \/>\u0627\u0632 Redis \u0628\u0631\u0627\u06cc \u0630\u062e\u06cc\u0631\u0647 \u0622\u062f\u0631\u0633 \u0647\u0627\u06cc IP \u0648 \u062a\u0639\u062f\u0627\u062f \u062a\u0644\u0627\u0634 \u0647\u0627\u06cc \u0646\u0627\u0645\u0648\u0641\u0642 \u0622\u0646\u0647\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u06cc\u062f.<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>import { Injectable } from '@nestjs\/common';\nimport { InjectRedis, Redis } from '@nestjs-modules\/ioredis';\n\n@Injectable()\nexport class IpBlockingService {\n  constructor(@InjectRedis() private readonly redis: Redis) {}\n\n  async incrementFailedAttempts(ip: string): Promise<void> {\n    const attempts = await this.redis.incr(`ip:${ip}:attempts`);\n    if (attempts === 1) {\n      await this.redis.expire(`ip:${ip}:attempts`, 3600); \/\/ Expire after 1 hour\n    }\n  }\n\n  async isIpBlocked(ip: string): Promise<boolean> {\n    const attempts = await this.redis.get(`ip:${ip}:attempts`);\n    return attempts &amp;&amp; parseInt(attempts) &gt;= 10; \/\/ Block after 10 failed attempts\n  }\n}\n<\/boolean><\/void><\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u062f \u06a9\u0647 \u0622\u06cc\u0627 IP \u0642\u0628\u0644 \u0627\u0632 \u067e\u0631\u062f\u0627\u0632\u0634 \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0648\u0631\u0648\u062f \u0628\u0647 \u0633\u06cc\u0633\u062a\u0645 \u0645\u0633\u062f\u0648\u062f \u0634\u062f\u0647 \u0627\u0633\u062a:<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight plaintext\"><code>@Post('login')\nasync login(@Body() credentials: any, @Req() req: Request) {\n  const ip = req.ip;\n  if (await this.ipBlockingService.isIpBlocked(ip)) {\n    throw new UnauthorizedException('IP blocked due to suspicious activity');\n  }\n\n  \/\/ Proceed with login\n}\n<\/code><\/pre>\n<div class=\"highlight__panel js-actions-panel\">\n<div class=\"highlight__panel-action js-fullscreen-code-action\">\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-on\"><title>\u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u0631\u0627 \u0648\u0627\u0631\u062f \u06a9\u0646\u06cc\u062f<\/title>\n    <path d=\"M16 3h6v6h-2V5h-4V3zM2 3h6v2H4v4H2V3zm18 16v-4h2v6h-6v-2h4zM4 19h4v2H2v-6h2v4z\"\/>\n<\/svg><\/p>\n<p>    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"20px\" height=\"20px\" viewbox=\"0 0 24 24\" class=\"highlight-action crayons-icon highlight-action--fullscreen-off\"><title>\u0627\u0632 \u062d\u0627\u0644\u062a \u062a\u0645\u0627\u0645 \u0635\u0641\u062d\u0647 \u062e\u0627\u0631\u062c \u0634\u0648\u06cc\u062f<\/title>\n    <path d=\"M18 7h4v2h-6V3h2v4zM8 9H2V7h4V3h2v6zm10 8v4h-2v-6h6v2h-4zM8 15v6H6v-4H2v-2h6z\"\/>\n<\/svg><\/p>\n<\/div>\n<\/div>\n<\/div>\n<p>\u062c\u0644\u0648\u06af\u06cc\u0631\u06cc \u0627\u0632 \u062d\u0645\u0644\u0627\u062a \u0646\u06cc\u0631\u0648\u06cc \u0628\u06cc \u0631\u062d\u0645\u0627\u0646\u0647 \u0646\u06cc\u0627\u0632 \u0628\u0647 \u06cc\u06a9 \u0631\u0648\u06cc\u06a9\u0631\u062f \u0686\u0646\u062f \u0644\u0627\u06cc\u0647 \u062f\u0627\u0631\u062f. \u0628\u0627 \u062a\u0631\u06a9\u06cc\u0628 \u0627\u06cc\u0646 \u062a\u06a9\u0646\u06cc\u06a9 \u0647\u0627 \u060c \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u062f \u0627\u0645\u0646\u06cc\u062a \u0628\u0627\u0637\u0646 Nestjs \u062e\u0648\u062f \u0631\u0627 \u0628\u0647 \u0645\u06cc\u0632\u0627\u0646 \u0642\u0627\u0628\u0644 \u062a\u0648\u062c\u0647\u06cc \u0627\u0641\u0632\u0627\u06cc\u0634 \u062f\u0647\u06cc\u062f. <\/p>\n<p>\u0628\u0647 \u06cc\u0627\u062f \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f \u06a9\u0647 \u0647\u0631 \u067e\u0631\u0648\u0698\u0647 \u0646\u06cc\u0627\u0632\u0647\u0627\u06cc \u0645\u0646\u062d\u0635\u0631 \u0628\u0647 \u0641\u0631\u062f \u062e\u0648\u062f \u0631\u0627 \u062f\u0627\u0631\u062f \u060c \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0627\u06cc\u0646 \u062a\u06a9\u0646\u06cc\u06a9 \u0647\u0627 \u0631\u0627 \u0628\u0631 \u0627\u06cc\u0646 \u0627\u0633\u0627\u0633 \u062a\u0637\u0628\u06cc\u0642 \u062f\u0647\u06cc\u062f. \u0628\u0627 \u0645\u0633\u062a\u0646\u062f\u0627\u062a Nestjs \u0648 \u0627\u06a9\u0648\u0633\u06cc\u0633\u062a\u0645 Node.js \u06a9\u0647 \u0628\u0647 \u0633\u0631\u0639\u062a \u062f\u0631 \u062d\u0627\u0644 \u062a\u062d\u0648\u0644 \u0647\u0633\u062a\u0646\u062f \u060c \u0628\u0647 \u0631\u0648\u0632 \u0628\u0627\u0634\u06cc\u062f \u062a\u0627 \u0627\u0632 \u0627\u06cc\u0646 \u0686\u0627\u0631\u0686\u0648\u0628 \u0642\u062f\u0631\u062a\u0645\u0646\u062f \u0646\u0647\u0627\u06cc\u062a \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0631\u0627 \u0628\u0628\u0631\u06cc\u062f. \u0628\u0631\u0646\u0627\u0645\u0647 \u0646\u0648\u06cc\u0633\u06cc \u0645\u0628\u0627\u0631\u06a9!<\/p>\n<p>\u0628\u06cc\u0627\u06cc\u06cc\u062f \u0645\u062a\u0635\u0644 \u0634\u0648\u06cc\u0645 <\/p>\n<p>Linkedln | GitHub | <a href=\"https:\/\/twitter.com\/boyinbodeee\" target=\"_blank\" rel=\"noopener noreferrer nofollow\">\u062a\u0648\u06cc\u06cc\u062a\u0631<\/a> | <\/p>\n<\/p><\/div>\n<p><script async src=\"\/\/platform.twitter.com\/widgets.js\" charset=\"utf-8\"><\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628 \u062f\u0631\u06a9 \u062d\u0645\u0644\u0627\u062a \u0628\u06cc \u0631\u062d\u0645\u0627\u0646\u0647 \u062a\u06a9\u0646\u06cc\u06a9 \u0647\u0627\u06cc \u067e\u06cc\u0634\u0631\u0641\u062a\u0647 \u0628\u0631\u0627\u06cc \u062c\u0644\u0648\u06af\u06cc\u0631\u06cc \u0627\u0632 \u062d\u0645\u0644\u0627\u062a \u0646\u06cc\u0631\u0648\u06cc \u0628\u06cc \u0631\u062d\u0645\u0627\u0646\u0647 \u062a\u0646\u0638\u06cc\u0645 \u0645\u062d\u062f\u0648\u062f \u06a9\u0631\u062f\u0646 \u0646\u0631\u062e \u0627\u062c\u0631\u0627\u06cc \u0642\u0641\u0644 \u062d\u0633\u0627\u0628 \u0627\u0641\u0632\u0648\u062f\u0646 \u062a\u0623\u06cc\u06cc\u062f Captcha \u0645\u0633\u062f\u0648\u062f \u06a9\u0631\u062f\u0646 IP \u0647\u0627\u06cc \u0645\u0634\u06a9\u0648\u06a9 \u0628\u0647\u062a\u0631\u06cc\u0646 \u0631\u0648\u0634\u0647\u0627 \u067e\u0627\u06cc\u0627\u0646 \u062d\u0645\u0644\u0627\u062a \u0646\u06cc\u0631\u0648\u06cc \u0628\u06cc \u0631\u062d\u0645\u0627\u0646\u0647 \u06cc\u06a9 \u062a\u0647\u062f\u06cc\u062f \u0627\u0645\u0646\u06cc\u062a\u06cc \u0645\u0634\u062a\u0631\u06a9 \u0627\u0633\u062a \u06a9\u0647 \u062f\u0631 \u0622\u0646 \u06cc\u06a9 \u0645\u0647\u0627\u062c\u0645 \u0628\u0627 \u062a\u0644\u0627\u0634 \u0628\u0631\u0627\u06cc \u062a\u0631\u06a9\u06cc\u0628 \u0647\u0627\u06cc \u0646\u0627\u0645 \u06a9\u0627\u0631\u0628\u0631\u06cc\/\u0631\u0645\u0632 &hellip;<\/p>\n","protected":false},"author":2,"featured_media":101520,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"https:\/\/media2.dev.to\/dynamic\/image\/width=1000,height=500,fit=cover,gravity=auto,format=auto\/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk8u9phpqg50c20nc1fsz.png","fifu_image_alt":"","footnotes":""},"categories":[339],"tags":[],"class_list":["post-101519","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev"],"_links":{"self":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/101519","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/comments?post=101519"}],"version-history":[{"count":0,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/101519\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media\/101520"}],"wp:attachment":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media?parent=101519"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/categories?post=101519"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/tags?post=101519"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}