{"id":479222,"date":"2026-05-10T13:16:18","date_gmt":"2026-05-10T13:16:18","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=479222"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=479222","title":{"rendered":"ASOC \u043d\u0430 \u043a\u043e\u043b\u0435\u043d\u043a\u0435: \u043a\u0430\u043a \u044f \u043d\u0430\u0432\u0430\u0439\u0431\u043a\u043e\u0434\u0438\u043b \u0437\u0430\u043c\u0435\u043d\u0443 DefectDojo \u0434\u043b\u044f \u0441\u0432\u043e\u0438\u0445 \u0437\u0430\u0434\u0430\u0447 \u0441 \u043e\u0431\u043e\u0433\u0430\u0449\u0435\u043d\u0438\u0435\u043c \u0438\u0437 \u0411\u0414\u0423 \u0424\u0421\u0422\u042d\u041a"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041a\u043e\u0433\u0434\u0430 \u044f \u043d\u0430\u0447\u0430\u043b \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f, \u0447\u0435\u043c \u0432 \u043c\u0438\u0440\u0435 \u043e\u043f\u0435\u043d\u0441\u043e\u0440\u0441\u0430 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043a\u0440\u044b\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 ASOC \/ Vulnerability Management, \u0432\u044b\u0431\u043e\u0440 \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0433\u0440\u0443\u0441\u0442\u043d\u044b\u043c. \u041f\u043e \u0441\u0443\u0442\u0438 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u044d\u0442\u043e DefectDojo. \u0421\u0430\u043c \u044f \u0435\u0433\u043e \u0432 \u043f\u0440\u043e\u0434\u0435 \u043d\u0435 \u0442\u0430\u0449\u0438\u043b, \u043d\u043e \u043e\u0442 \u043a\u043e\u043b\u043b\u0435\u0433 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e \u0441\u043b\u044b\u0448\u0430\u043b \u043e\u0434\u043d\u0443 \u0438 \u0442\u0443 \u0436\u0435 \u0431\u043e\u043b\u044c: \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u0431\u044a\u0451\u043c\u0430\u0445 \u043e\u043d \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0437\u0430\u0445\u043b\u0451\u0431\u044b\u0432\u0430\u0442\u044c\u0441\u044f, \u0438 \u0442\u0435\u0431\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0437\u0430\u0445\u043e\u0434\u0438\u0442\u044c, \u0430 \u0430\u043d\u0430\u043b\u043e\u0433\u043e\u0432 \u0441 \u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u043a\u0438\u043c \u0432\u0438\u0434\u043e\u043c \u0438 \u0411\u0414\u0423 \u0424\u0421\u0422\u042d\u041a \u00ab\u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438\u00bb \u0432 \u043e\u043f\u0435\u043d\u0441\u043e\u0440\u0441\u0435 \u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u043d\u0430\u0448\u0451\u043b. \u0422\u0430\u043a \u0438 \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u043c\u043e\u044f ASOC-\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430: Go + PostgreSQL + Redis Streams + React, \u0440\u0430\u0437\u0432\u0451\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 <code>docker compose up<\/code>, \u043c\u0438\u043b\u043b\u0438\u043e\u043d \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0431\u0435\u0437 \u0442\u043e\u0440\u043c\u043e\u0437\u043e\u0432 (\u043f\u043e\u0447\u0442\u0438), \u043e\u0431\u043e\u0433\u0430\u0449\u0435\u043d\u0438\u0435 \u0438\u0437 7 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432, \u0444\u043e\u0440\u043c\u0443\u043b\u0430 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0438\u0437\u0430\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e CVSS, \u043d\u043e \u0435\u0449\u0451 EPSS, CISA KEV \u0438 \u0411\u0414\u0423 \u0424\u0421\u0422\u042d\u041a. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043f\u0440\u043e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u0433\u0440\u0430\u0431\u043b\u0438 \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u044f \u0432\u044b\u043a\u0438\u043d\u0443\u043b ORM \u0435\u0449\u0451 \u0434\u043e \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u0447\u043a\u0438 SQL.<\/p>\n<p>\u042d\u0442\u043e \u043d\u0435 \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u0440\u043e \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0440\u043e\u0434\u0443\u043a\u0442 \u0438 \u043d\u0435 \u043f\u0438\u0430\u0440-\u0440\u0435\u043b\u0438\u0437. \u0421\u043a\u043e\u0440\u0435\u0435 \u0440\u0430\u0437\u0431\u043e\u0440 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b\u043b \u0441\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d <strong>Red Lycoris<\/strong>, \u043e\u043f\u0435\u043d\u0441\u043e\u0440\u0441-\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u0434\u043b\u044f \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f, \u0434\u0435\u0434\u0443\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438, \u043e\u0431\u043e\u0433\u0430\u0449\u0435\u043d\u0438\u044f \u0438 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0435\u0439. \u042f \u0434\u0435\u043b\u0430\u044e \u0435\u0451 \u043e\u0434\u0438\u043d, \u0438 \u0435\u0441\u043b\u0438 \u043a\u043e\u043c\u0443-\u0442\u043e \u043e\u043d\u0430 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f, \u0431\u0443\u0434\u0443 \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0434. \u0415\u0441\u043b\u0438 \u043d\u0430\u0439\u0434\u0451\u0442\u0435, \u0433\u0434\u0435 \u044f \u043e\u0448\u0438\u0431\u0441\u044f \u0432 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435, \u0431\u0443\u0434\u0443 \u0440\u0430\u0434 \u0432\u0434\u0432\u043e\u0439\u043d\u0435.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/612\/aa4\/093\/612aa40938e05bfbf473eac315ad549d.png\" alt=\"\u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u043e\u0432\" title=\"\u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u043e\u0432\" width=\"1905\" height=\"910\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/612\/aa4\/093\/612aa40938e05bfbf473eac315ad549d.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/612\/aa4\/093\/612aa40938e05bfbf473eac315ad549d.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u043e\u0432<\/figcaption><\/div>\n<\/figure>\n<h3>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 ASOC \u0438 \u0437\u0430\u0447\u0435\u043c \u043e\u043d \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0443\u0436\u0435\u043d<\/h3>\n<p>ASOC (Application Security Orchestration and Correlation) &#8212; \u044d\u0442\u043e \u0441\u043b\u043e\u0439 \u043c\u0435\u0436\u0434\u0443 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0438 \u043b\u044e\u0434\u044c\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u043e \u0438\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c: AppSec-\u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c\u0438, \u0442\u0438\u043c\u043b\u0438\u0434\u0430\u043c\u0438 \u0438 \u0438\u043d\u043e\u0433\u0434\u0430 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0430\u043c\u0438 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c, ASOC \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0438\u0437 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u043a\u0430\u043d\u0435\u0440\u043e\u0432 \u0432 \u043e\u0434\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435, \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u0438\u0445 \u043a \u0435\u0434\u0438\u043d\u043e\u043c\u0443 \u0432\u0438\u0434\u0443, \u0443\u0431\u0440\u0430\u0442\u044c \u0434\u0443\u0431\u043b\u0438, \u0441\u0432\u044f\u0437\u0430\u0442\u044c \u043d\u0430\u0445\u043e\u0434\u043a\u0438 \u0441 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u043c\u0438 \u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f.<\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 AppSec-\u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0442\u044c\u0441\u044f, \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435 \u043e\u0434\u0438\u043d \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043a\u0430\u043d\u0435\u0440, \u0430 \u043d\u0430\u0431\u043e\u0440 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u043e\u0434 \u0440\u0430\u0437\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a. \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0441\u0442\u0435\u043a \u0443 \u0432\u0441\u0435\u0445 \u0440\u0430\u0437\u043d\u044b\u0439: \u0433\u0434\u0435-\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 open-source, \u0433\u0434\u0435-\u0442\u043e \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u0433\u0434\u0435-\u0442\u043e \u0432\u0441\u0451 \u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u043d\u0430 \u0441\u043a\u0440\u0438\u043f\u0442\u0430\u0445 \u0432 CI. \u041d\u043e \u0441\u0430\u043c\u0438 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u0447\u0430\u0441\u0442\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0442\u0441\u044f:<\/p>\n<ul>\n<li>\n<p><strong>SAST<\/strong> &#8212; \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437 \u043a\u043e\u0434\u0430: Semgrep, OpenGrep, SonarQube, CodeQL \u0438\u043b\u0438 \u0430\u043d\u0430\u043b\u043e\u0433\u0438.<\/p>\n<\/li>\n<li>\n<p><strong>SCA<\/strong> &#8212; \u0430\u043d\u0430\u043b\u0438\u0437 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0438 open-source \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432: Trivy, Grype, Snyk, Mend \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<li>\n<p><strong>DAST<\/strong> &#8212; \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439: OWASP ZAP, Burp Suite, Acunetix \u0438\u043b\u0438 \u043f\u043e\u0445\u043e\u0436\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b.<\/p>\n<\/li>\n<li>\n<p><strong>IaC<\/strong> &#8212; \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439: Checkov, tfsec, Trivy config \u0438 \u0430\u043d\u0430\u043b\u043e\u0433\u0438.<\/p>\n<\/li>\n<li>\n<p><strong>Secrets<\/strong> &#8212; \u043f\u043e\u0438\u0441\u043a \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432, \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u0438 \u043a\u043b\u044e\u0447\u0435\u0439: TruffleHog, Gitleaks \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u043a\u0430\u043d\u0435\u0440\u044b.<\/p>\n<\/li>\n<li>\n<p><strong>\u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b<\/strong> &#8212; \u0430\u043d\u0430\u043b\u0438\u0437 \u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u0438 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0432\u043d\u0443\u0442\u0440\u0438 \u043d\u0438\u0445: Trivy image, Grype \u0438 \u043f\u043e\u0445\u043e\u0436\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u043d\u0435 \u0438\u0437-\u0437\u0430 \u0441\u0430\u043c\u0438\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432. \u041a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043d\u0438\u0445 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u0435\u043d \u0432 \u0441\u0432\u043e\u0435\u0439 \u0437\u043e\u043d\u0435. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u043d\u0438 \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445: \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u0432\u043e\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u043e\u0442\u0447\u0451\u0442\u0430, \u0441\u0432\u043e\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u043e\u0441\u0442\u0438, \u0441\u0432\u043e\u0451 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u043e\u0432 \u0438 \u0441\u0432\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u0443 \u0438 \u0442\u0443 \u0436\u0435 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044c.<\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 <code>CVE-2021-44228<\/code> \u043c\u043e\u0436\u0435\u0442 \u0432\u0441\u043f\u043b\u044b\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043c\u0435\u0441\u0442\u0430\u0445: SCA-\u0441\u043a\u0430\u043d\u0435\u0440 \u043d\u0430\u0439\u0434\u0451\u0442 \u0435\u0433\u043e \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u0445, \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043d\u044b\u0439 \u0441\u043a\u0430\u043d\u0435\u0440 \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0440\u0430\u0437\u0430, \u0434\u0440\u0443\u0433\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0432 lockfile \u0438\u043b\u0438 SBOM. \u0424\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u044d\u0442\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043f\u0438\u0441\u0435\u0439, \u043d\u043e \u043f\u043e \u0441\u043c\u044b\u0441\u043b\u0443 \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u044c\u0441\u044f \u043a \u043e\u0434\u043d\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0435 \u0432 \u043e\u0434\u043d\u043e\u043c \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0435.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0443\u043c\u043d\u043e\u0436\u044c\u0442\u0435 \u044d\u0442\u043e \u043d\u0430 \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043c\u0430\u043d\u0434, \u0440\u0430\u0437\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0438 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0438 \u0432 CI. \u041d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043d\u0435 \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0437\u0430\u0434\u0430\u0447, \u0430 \u043f\u043e\u0442\u043e\u043a \u043d\u0430\u0445\u043e\u0434\u043e\u043a, \u0433\u0434\u0435 \u0447\u0430\u0441\u0442\u044c \u0434\u0443\u0431\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u0447\u0430\u0441\u0442\u044c \u0443\u0441\u0442\u0430\u0440\u0435\u043b\u0430, \u0447\u0430\u0441\u0442\u044c \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u043b\u0438\u044f\u043d\u0438\u044f, \u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u0430\u0436\u043d\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043b\u0435\u0433\u043a\u043e \u0442\u0435\u0440\u044f\u044e\u0442\u0441\u044f \u0432 \u0448\u0443\u043c\u0435.<\/p>\n<p>\u0412\u043e\u0442 \u0437\u0434\u0435\u0441\u044c \u0438 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043c\u044b\u0441\u043b ASOC: \u043d\u0435 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u043a\u0430\u043d\u0435\u0440\u044b, \u0430 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0438\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b, \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435, \u0441\u0432\u044f\u0437\u0430\u0442\u044c \u043d\u0430\u0445\u043e\u0434\u043a\u0438 \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439 \u0438 \u043f\u043e\u043c\u043e\u0447\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u0447\u0438\u043d\u0438\u0442\u044c \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c.<\/p>\n<p>ASOC \u043d\u0443\u0436\u0435\u043d \u043d\u0435 \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u043a\u0430\u043d\u0435\u0440\u044b, \u0430 \u0447\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043f\u0440\u0438\u0433\u043e\u0434\u043d\u044b\u043c\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b.<\/p>\n<p>\u041e\u0431\u044b\u0447\u043d\u043e \u043e\u043d \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0434\u0430\u0447:<\/p>\n<ol>\n<li>\n<p><strong>\u0418\u043c\u043f\u043e\u0440\u0442 \u0438 \u043f\u0430\u0440\u0441\u0438\u043d\u0433<\/strong> &#8212; \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043e\u0442\u0447\u0451\u0442\u044b \u043e\u0442 \u0440\u0430\u0437\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u0438\u0445 \u043a \u0435\u0434\u0438\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<\/li>\n<li>\n<p><strong>\u041d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/strong> &#8212; \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u0435\u0439, severity, \u0441\u0442\u0430\u0442\u0443\u0441\u044b, \u0442\u0438\u043f\u044b \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0438 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435.<\/p>\n<\/li>\n<li>\n<p><strong>\u0414\u0435\u0434\u0443\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u044f<\/strong> &#8212; \u0441\u043a\u043b\u0435\u0438\u0432\u0430\u0435\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0435\u0441\u044f \u043d\u0430\u0445\u043e\u0434\u043a\u0438, \u0447\u0442\u043e\u0431\u044b \u043e\u0434\u043d\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043d\u0435 \u0432\u0438\u0441\u0435\u043b\u0430 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0442\u0440\u0435\u043c\u044f \u0440\u0430\u0437\u043d\u044b\u043c\u0438 critical-\u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438.<\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0438\u0437\u0430\u0446\u0438\u044f<\/strong> &#8212; \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u0447\u0438\u043d\u0438\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u043c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u201c50 critical \u043e\u0442 \u0441\u043a\u0430\u043d\u0435\u0440\u0430\u201d \u0438 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u044d\u0442\u043e \u0440\u0430\u0437\u043d\u044b\u0435 \u0432\u0441\u0435\u043b\u0435\u043d\u043d\u044b\u0435.<\/p>\n<\/li>\n<li>\n<p><strong>API \u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441<\/strong> &#8212; \u0434\u0430\u0451\u0442 CI\/CD \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b, \u0430 AppSec \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043a\u0440\u0430\u043d \u0434\u043b\u044f \u0440\u0430\u0437\u0431\u043e\u0440\u0430, \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438 \u0438 \u043f\u0440\u0438\u043d\u044f\u0442\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439.<\/p>\n<\/li>\n<\/ol>\n<p>\u0412\u0430\u0436\u043d\u043e \u043d\u0435 \u043f\u0443\u0442\u0430\u0442\u044c ASOC \u0441\u043e \u0441\u043a\u0430\u043d\u0435\u0440\u043e\u043c, SIEM \u0438\u043b\u0438 ASM\/ASMP.<\/p>\n<p>ASOC \u0441\u0430\u043c \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0441\u043a\u0430\u043d\u0438\u0440\u0443\u0435\u0442. \u041e\u043d \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043e\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0441 \u043d\u0438\u043c\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c.<br \/>SIEM \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0440\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438, \u043b\u043e\u0433\u0438 \u0438 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433.<br \/>ASM\/ASMP &#8212; \u043f\u0440\u043e \u0432\u043d\u0435\u0448\u043d\u044e\u044e \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c \u0430\u0442\u0430\u043a\u0438: \u0434\u043e\u043c\u0435\u043d\u044b, IP, \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0438 \u044d\u043a\u0441\u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435.<br \/>ASOC &#8212; \u043f\u0440\u043e AppSec-\u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u043d\u0443\u0442\u0440\u0438 SDLC: \u043a\u043e\u0434, \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b, IaC, \u0441\u0435\u043a\u0440\u0435\u0442\u044b \u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u0432 CI\/CD.<\/p>\n<h3>\u041f\u043e\u0447\u0435\u043c\u0443 \u044f \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u0441\u044f \u043d\u0430 DefectDojo<\/h3>\n<p><a href=\"https:\/\/github.com\/DefectDojo\/django-DefectDojo\" rel=\"noopener noreferrer nofollow\">DefectDojo<\/a> &#8212; \u0441\u0430\u043c\u044b\u0439 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 open-source ASOC. \u041d\u043e \u043f\u043e\u0441\u043b\u0435 \u043e\u0442\u0437\u044b\u0432\u043e\u0432 \u043a\u043e\u043b\u043b\u0435\u0433 \u0438 \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u043e\u0433\u043e \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f \u044f \u043f\u043e\u043d\u044f\u043b, \u0447\u0442\u043e \u0434\u043b\u044f \u043c\u043e\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u043e\u043d \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043d\u0435 \u0442\u0430\u043a \u0445\u043e\u0440\u043e\u0448\u043e.<\/p>\n<p><strong>\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c.<\/strong> \u041d\u0430 \u043e\u0431\u044a\u0451\u043c\u0430\u0445 \u043e\u043a\u043e\u043b\u043e ~100k \u043d\u0430\u0445\u043e\u0434\u043e\u043a \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0443\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u0442\u044f\u0436\u0451\u043b\u044b\u043c: \u0444\u0438\u043b\u044c\u0442\u0440\u044b \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0434\u043e\u043b\u0433\u043e, \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0435 \u0442\u0430\u043a \u043e\u0442\u0437\u044b\u0432\u0447\u0438\u0432\u043e, \u043a\u0430\u043a \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b. \u041d\u0430 1M+ \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0431\u0435\u0437 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0436\u0438\u0442\u044c \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0441\u043b\u043e\u0436\u043d\u043e. \u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 Django + ORM + \u043f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u044f \u0447\u0435\u0440\u0435\u0437 OFFSET \u0434\u0430\u044e\u0442 \u043e \u0441\u0435\u0431\u0435 \u0437\u043d\u0430\u0442\u044c, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0448\u044c \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043f\u043b\u0430\u043d\u044b \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0445.<\/p>\n<p><strong>\u041d\u0435\u0442 \u0411\u0414\u0423 \u0424\u0421\u0422\u042d\u041a \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438.<\/strong> \u0414\u043b\u044f \u0440\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u0438\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u044d\u0442\u043e \u0432\u0430\u0436\u043d\u044b\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0434\u0430\u043d\u043d\u044b\u0445: \u0433\u0434\u0435-\u0442\u043e \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u044b\u0439, \u0433\u0434\u0435-\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u044b\u0439. \u0412 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u043c \u043d\u0430\u0431\u043e\u0440\u0435 \u0447\u0430\u0449\u0435 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f NVD, EPSS, \u0438\u043d\u043e\u0433\u0434\u0430 KEV. \u0411\u0414\u0423 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e, \u043d\u043e \u044d\u0442\u043e \u0443\u0436\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430, \u0430 \u043d\u0435 \u0433\u043e\u0442\u043e\u0432\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b.<\/p>\n<p><strong>\u0423\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441.<\/strong> Bootstrap 3 \u0438 Django-\u0448\u0430\u0431\u043b\u043e\u043d\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442, \u043d\u043e \u0432 2026 \u0433\u043e\u0434\u0443 \u043e\u0442 ASOC \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f UX: \u0431\u044b\u0441\u0442\u0440\u044b\u0445 \u0442\u0430\u0431\u043b\u0438\u0446 \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u043e\u0431\u044a\u0451\u043c\u044b, \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0444\u0430\u0441\u0435\u0442\u043d\u043e\u0439 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438, \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0432 URL \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043b\u043b\u0435\u0433\u0435 \u0441\u0441\u044b\u043b\u043a\u0443 \u0443\u0436\u0435 \u0441 \u043d\u0443\u0436\u043d\u044b\u043c\u0438 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u043c\u0438.<\/p>\n<p><strong>\u0420\u0430\u0431\u043e\u0442\u0430 \u0432 \u0437\u0430\u043a\u0440\u044b\u0442\u043e\u043c \u043a\u043e\u043d\u0442\u0443\u0440\u0435.<\/strong> \u0414\u043b\u044f \u0431\u0430\u043d\u043a\u043e\u0432, \u0433\u043e\u0441\u0430 \u0438 \u0442\u0435\u043b\u0435\u043a\u043e\u043c\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430 &#8212; \u043d\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u0430 \u043e\u0431\u044b\u0447\u043d\u043e\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0435. DefectDojo \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043e\u0444\u043b\u0430\u0439\u043d, \u043d\u043e \u0431\u0435\u0437 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432 \u043e\u0431\u043e\u0433\u0430\u0449\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u043c. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0441\u043a\u043e\u0440\u0435\u0435 \u0432 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u043d\u0430\u0445\u043e\u0434\u043e\u043a, \u0447\u0435\u043c \u0432 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<p>\u042f \u043d\u0435 \u0430\u0433\u0438\u0442\u0438\u0440\u0443\u044e \u043f\u0440\u043e\u0442\u0438\u0432 DefectDojo. \u0414\u043b\u044f \u043c\u043d\u043e\u0433\u0438\u0445 \u043a\u043e\u043c\u0430\u043d\u0434 \u044d\u0442\u043e \u0432\u0441\u0451 \u0435\u0449\u0451 \u0431\u043e\u043b\u0435\u0435 \u0437\u0440\u0435\u043b\u044b\u0439 \u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440, \u0447\u0435\u043c \u043c\u043e\u0439 ASOC, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043d\u0430 \u0443\u043c\u0435\u0440\u0435\u043d\u043d\u044b\u0445 \u043e\u0431\u044a\u0451\u043c\u0430\u0445. \u041f\u0440\u043e\u0441\u0442\u043e \u043c\u043d\u0435 \u043d\u0443\u0436\u0435\u043d \u0431\u044b\u043b \u0434\u0440\u0443\u0433\u043e\u0439 \u0444\u043e\u043a\u0443\u0441: \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0440\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u0438\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442, \u0437\u0430\u043a\u0440\u044b\u0442\u044b\u0439 \u043a\u043e\u043d\u0442\u0443\u0440 \u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u0440\u0430\u0437\u0431\u043e\u0440 \u043d\u0430\u0445\u043e\u0434\u043e\u043a.<\/p>\n<h3>\u0427\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u044f<\/h3>\n<p>\u041d\u0430 \u0441\u0442\u0430\u0440\u0442\u0435 \u044f \u0441\u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u043b \u0434\u043b\u044f \u0441\u0435\u0431\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th data-colwidth=\"279\" width=\"279\">\n<p align=\"left\">\u0422\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0435<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0417\u0430\u0447\u0435\u043c<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td data-colwidth=\"279\" width=\"279\">\n<p align=\"left\"><strong>\u0420\u0430\u0437\u0432\u0451\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0443 \u0441\u0435\u0431\u044f, \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0431\u0435\u0437 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0426\u0435\u043b\u0435\u0432\u0430\u044f \u0430\u0443\u0434\u0438\u0442\u043e\u0440\u0438\u044f &#8212; \u0431\u0430\u043d\u043a\u0438, \u0433\u043e\u0441\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0438 \u0442\u0435\u043b\u0435\u043a\u043e\u043c. \u0414\u043b\u044f \u0442\u0430\u043a\u0438\u0445 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0439 \u043e\u0431\u043b\u0430\u0447\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0447\u0430\u0441\u0442\u043e \u043d\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043f\u043e \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0438 compliance.<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"279\" width=\"279\">\n<p align=\"left\"><strong>\u0411\u0414\u0423 \u0424\u0421\u0422\u042d\u041a \u043a\u0430\u043a \u043f\u0435\u0440\u0432\u043e\u043a\u043b\u0430\u0441\u0441\u043d\u044b\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0414\u043b\u044f \u0440\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u0438\u0445 \u043a\u043e\u043c\u0430\u043d\u0434 \u044d\u0442\u043e \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u201c\u0435\u0449\u0451 \u043e\u0434\u043d\u0430 \u0431\u0430\u0437\u0430\u201d, \u0430 \u0432\u0430\u0436\u043d\u044b\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0434\u043b\u044f \u0441\u0432\u0435\u0440\u043a\u0438, \u043e\u0431\u043e\u0433\u0430\u0449\u0435\u043d\u0438\u044f \u0438 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0435\u0439.<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"279\" width=\"279\">\n<p align=\"left\"><strong>1M+ \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0431\u0435\u0437 \u0442\u043e\u0440\u043c\u043e\u0437\u043e\u0432<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0414\u0430\u0436\u0435 \u043d\u0435 \u0441\u0430\u043c\u0430\u044f \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f \u0437\u0430 \u043f\u0430\u0440\u0443 \u043b\u0435\u0442 \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u043a\u043e\u043f\u0438\u0442\u044c \u0441\u043e\u0442\u043d\u0438 \u0442\u044b\u0441\u044f\u0447 \u043d\u0430\u0445\u043e\u0434\u043e\u043a, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0435\u0441\u043b\u0438 \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043e \u0432 CI\/CD.<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"279\" width=\"279\">\n<p align=\"left\"><strong>\u041e\u0434\u0438\u043d \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a + Postgres + Redis<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0411\u0435\u0437 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e Kubernetes \u0438 \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b. \u041f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u043a\u0435.<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"279\" width=\"279\">\n<p align=\"left\"><strong>\u041f\u043e\u043d\u044f\u0442\u043d\u044b\u0439 REST API + OpenAPI<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u0430\u0445\u043e\u0434\u043a\u0438 \u0447\u0430\u0449\u0435 \u043f\u0440\u0438\u0435\u0437\u0436\u0430\u044e\u0442 \u0438\u0437 CI\/CD, \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438, \u0430 \u043d\u0435 \u0447\u0435\u0440\u0435\u0437 \u0440\u0443\u0447\u043d\u0443\u044e \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435. \u0425\u043e\u0442\u044f \u0440\u0443\u0447\u043d\u043e\u0439 \u0438\u043c\u043f\u043e\u0440\u0442 \u0442\u043e\u0436\u0435 \u043d\u0443\u0436\u0435\u043d.<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"279\" width=\"279\">\n<p align=\"left\"><strong>\u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">ASOC \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043a\u0430\u043a \u0430\u0434\u043c\u0438\u043d\u043a\u0430 \u0438\u0437 2012 \u0433\u043e\u0434\u0430. \u041d\u0443\u0436\u0435\u043d \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0439, \u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u0438 \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u044b\u0439 UI \u0431\u0435\u0437 \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u0430.<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"279\" width=\"279\">\n<p align=\"left\"><strong>\u0420\u0443\u0441\u0441\u043a\u0438\u0439 \u044f\u0437\u044b\u043a \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0426\u0435\u043b\u0435\u0432\u0430\u044f \u0430\u0443\u0434\u0438\u0442\u043e\u0440\u0438\u044f &#8212; \u0440\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u0441\u0442\u0430\u0442\u0443\u0441\u044b \u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u043f\u043e\u043d\u044f\u0442\u043d\u044b \u0431\u0435\u0437 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430.<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 <strong>Red Lycoris<\/strong> \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u0431\u0435\u0437 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0431\u0440\u0435\u043d\u0434-\u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438. \u042f \u043f\u0440\u043e\u0441\u0442\u043e \u0447\u0430\u0441\u0442\u043e \u0432\u0438\u0434\u0435\u043b \u044d\u0442\u043e\u0442 \u0446\u0432\u0435\u0442\u043e\u043a \u0432 \u0430\u043d\u0438\u043c\u0435.<\/p>\n<h3>\u0421\u0442\u0435\u043a \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a\u043e\u0439<\/h3>\n<p>\u0421\u0442\u0435\u043a \u044f \u0432\u044b\u0431\u0438\u0440\u0430\u043b \u043d\u0435 \u043f\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443 \u201c\u0447\u0442\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u043c\u043e\u0434\u043d\u043e\u201d, \u0430 \u043f\u043e\u0434 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f: \u0437\u0430\u043a\u0440\u044b\u0442\u044b\u0439 \u043a\u043e\u043d\u0442\u0443\u0440, \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u043e\u0431\u044a\u0451\u043c\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0440\u0430\u0437\u0432\u0451\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0438 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430.<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th data-colwidth=\"167\" width=\"167\">\n<p align=\"left\">\u0421\u043b\u043e\u0439<\/p>\n<\/th>\n<th data-colwidth=\"191\" width=\"191\">\n<p align=\"left\">\u0412\u044b\u0431\u043e\u0440<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u041f\u043e\u0447\u0435\u043c\u0443<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td data-colwidth=\"167\" width=\"167\">\n<p align=\"left\">\u0421\u0435\u0440\u0432\u0435\u0440\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c<\/p>\n<\/td>\n<td data-colwidth=\"191\" width=\"191\">\n<p align=\"left\"><strong>Go 1.25 + chi router<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041e\u0434\u0438\u043d \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a, \u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u0441\u0442\u0430\u0440\u0442, \u0445\u043e\u0440\u043e\u0448\u0430\u044f \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u0438 \u0443\u0434\u043e\u0431\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u0434\u043b\u044f \u0444\u043e\u043d\u043e\u0432\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438.<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"167\" width=\"167\">\n<p align=\"left\">\u0411\u0430\u0437\u0430<\/p>\n<\/td>\n<td data-colwidth=\"191\" width=\"191\">\n<p align=\"left\"><strong>PostgreSQL 16<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">JSONB \u0434\u043b\u044f enrichment-\u0434\u0430\u043d\u043d\u044b\u0445, \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0442\u044f\u0436\u0451\u043b\u044b\u0445 \u0432\u0438\u0442\u0440\u0438\u043d, \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u044b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0434\u043b\u044f \u0447\u0430\u0441\u0442\u044b\u0445 \u0432\u044b\u0431\u043e\u0440\u043e\u043a \u0438 \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u0436\u0443\u0440\u043d\u0430\u043b\u0430 \u0430\u0443\u0434\u0438\u0442\u0430.<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"167\" width=\"167\">\n<p align=\"left\">\u041e\u0447\u0435\u0440\u0435\u0434\u044c<\/p>\n<\/td>\n<td data-colwidth=\"191\" width=\"191\">\n<p align=\"left\"><strong>Redis 7 Streams<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0414\u043b\u044f \u0444\u043e\u043d\u043e\u0432\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u043d\u0443\u0436\u043d\u0430 \u043d\u0430\u0434\u0451\u0436\u043d\u0430\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0441 \u0433\u0440\u0443\u043f\u043f\u0430\u043c\u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0435\u0439. Kafka \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u0451\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u043d\u043e\u0434\u0435 \u0431\u044b\u043b\u0430 \u0431\u044b \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u043e\u0439.<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"167\" width=\"167\">\n<p align=\"left\">\u041a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0430\u044f \u0447\u0430\u0441\u0442\u044c<\/p>\n<\/td>\n<td data-colwidth=\"191\" width=\"191\">\n<p align=\"left\"><strong>React 18 + TypeScript strict + Vite<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">TanStack Table, Query \u0438 Virtual \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0442\u044f\u0436\u0451\u043b\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430: \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0444\u0438\u043b\u044c\u0442\u0440\u044b \u0438 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e.<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"167\" width=\"167\">\n<p align=\"left\">\u0421\u0442\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/p>\n<\/td>\n<td data-colwidth=\"191\" width=\"191\">\n<p align=\"left\"><strong>Tailwind CSS + shadcn\/ui<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0431\u0435\u0437 \u0440\u0443\u0447\u043d\u043e\u0439 CSS-\u0444\u0435\u0440\u043c\u044b. \u0422\u0451\u043c\u043d\u0430\u044f \u0442\u0435\u043c\u0430 &#8212; \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e.<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"167\" width=\"167\">\n<p align=\"left\">\u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0411\u0414<\/p>\n<\/td>\n<td data-colwidth=\"191\" width=\"191\">\n<p align=\"left\"><strong>pgx\/v5, \u0431\u0435\u0437 ORM<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041d\u0443\u0436\u0435\u043d \u043f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u043d\u0430\u0434 SQL, \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\u0438, \u043f\u043b\u0430\u043d\u0430\u043c\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435\u043c \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0445.<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"167\" width=\"167\">\n<p align=\"left\">\u041c\u0438\u0433\u0440\u0430\u0446\u0438\u0438<\/p>\n<\/td>\n<td data-colwidth=\"191\" width=\"191\">\n<p align=\"left\"><strong>golang-migrate<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u0440\u043e\u0441\u0442\u044b\u0435 SQL-\u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u0431\u0435\u0437 \u043b\u0438\u0448\u043d\u0435\u0439 \u043c\u0430\u0433\u0438\u0438 \u0438 \u0441\u043a\u0440\u044b\u0442\u044b\u0445 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0439.<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td data-colwidth=\"167\" width=\"167\">\n<p align=\"left\">\u0420\u0430\u0437\u0432\u0451\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435<\/p>\n<\/td>\n<td data-colwidth=\"191\" width=\"191\">\n<p align=\"left\"><strong>Docker Compose<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0411\u0435\u0437 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e Kubernetes. \u041e\u0434\u0438\u043d <code>up -d<\/code> -\u0438 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u043a\u0435.<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u044f \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0432 <a href=\"http:\/\/CLAUDE.md\" rel=\"noopener noreferrer nofollow\"><code>CLAUDE.md<\/code><\/a> \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f. \u041e\u043d\u0438 \u0443\u0436\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u0441\u043f\u0430\u0441\u0430\u043b\u0438 \u043f\u0440\u043e\u0435\u043a\u0442 \u043e\u0442 \u043c\u043e\u0438\u0445 \u0436\u0435 \u0438\u043c\u043f\u0443\u043b\u044c\u0441\u043e\u0432 \u201c\u0430 \u0434\u0430\u0432\u0430\u0439 \u043f\u0440\u0438\u043a\u0440\u0443\u0442\u0438\u043c \u0435\u0449\u0451 \u0432\u043e\u0442 \u044d\u0442\u043e\u201d:<\/p>\n<ul>\n<li>\n<p>\u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e ORM &#8212; \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0438\u0441\u0442\u044b\u0439 SQL \u0447\u0435\u0440\u0435\u0437 <code>pgx\/v5<\/code>;<\/p>\n<\/li>\n<li>\n<p>\u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u043f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u0438 \u0447\u0435\u0440\u0435\u0437 <code>OFFSET<\/code> &#8212; \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u0443\u0440\u0441\u043e\u0440\u043d\u0430\u044f \u043f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u044f;<\/p>\n<\/li>\n<li>\n<p>\u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043d\u043e\u0432\u044b\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0431\u0435\u0437 \u044f\u0432\u043d\u043e\u0433\u043e \u043e\u0431\u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u044f;<\/p>\n<\/li>\n<li>\n<p>\u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0439 \u201c\u043d\u0430 \u0431\u0443\u0434\u0443\u0449\u0435\u0435\u201d &#8212; \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u0433\u0434\u0430, \u043a\u043e\u0433\u0434\u0430 \u0435\u0441\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u0434\u0432\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<\/li>\n<\/ul>\n<p>\u042f \u043f\u043e\u043d\u0438\u043c\u0430\u044e, \u0447\u0442\u043e \u0444\u0440\u0430\u0437\u0430 \u201c\u0431\u0435\u0437 ORM\u201d \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u0438\u0445 \u0437\u0432\u0443\u0447\u0438\u0442 \u0441\u043f\u043e\u0440\u043d\u043e. \u0414\u0430\u043b\u044c\u0448\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043f\u043e\u0447\u0435\u043c\u0443 \u0432 \u044d\u0442\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u044d\u0442\u043e \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043d\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435\u043c, \u0430 \u043e\u0441\u043e\u0437\u043d\u0430\u043d\u043d\u044b\u043c \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c.<\/p>\n<h3>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430: \u043a\u0443\u0434\u0430 \u0447\u0442\u043e \u0442\u0435\u0447\u0451\u0442<\/h3>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9c2\/b33\/01e\/9c2b3301eea6adb1abf22f399fe6ce56.png\" alt=\"\u042f \u043d\u0435 \u0445\u0443\u0434\u043e\u0436\u043d\u0438\u043a, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0442\u043e\u0436\u0435 \u0440\u0438\u0441\u043e\u0432\u0430\u043b\u043e \u0418\u0418\" title=\"\u042f \u043d\u0435 \u0445\u0443\u0434\u043e\u0436\u043d\u0438\u043a, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0442\u043e\u0436\u0435 \u0440\u0438\u0441\u043e\u0432\u0430\u043b\u043e \u0418\u0418\" width=\"1672\" height=\"941\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/9c2\/b33\/01e\/9c2b3301eea6adb1abf22f399fe6ce56.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9c2\/b33\/01e\/9c2b3301eea6adb1abf22f399fe6ce56.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u042f \u043d\u0435 \u0445\u0443\u0434\u043e\u0436\u043d\u0438\u043a, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0442\u043e\u0436\u0435 \u0440\u0438\u0441\u043e\u0432\u0430\u043b\u043e \u0418\u0418<\/figcaption><\/div>\n<\/figure>\n<h3>\u041f\u0430\u0440\u0441\u0435\u0440\u044b: \u0430\u0432\u0442\u043e\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0432\u043c\u0435\u0441\u0442\u043e \u201c\u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u201d<\/h3>\n<p>\u0412 DefectDojo \u043f\u0440\u0438 \u0438\u043c\u043f\u043e\u0440\u0442\u0435 \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0442\u0438\u043f \u0441\u043a\u0430\u043d\u0435\u0440\u0430. \u042f \u0445\u043e\u0442\u0435\u043b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u043d\u0430\u0447\u0435: \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0444\u0430\u0439\u043b, \u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u0441\u0430\u043c\u0430 \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u043f\u0435\u0440\u0435\u0434 \u043d\u0435\u0439.<\/p>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u0432 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 \u0435\u0441\u0442\u044c <strong>10 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 \u043f\u0430\u0440\u0441\u0435\u0440\u043e\u0432<\/strong>:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u041f\u0430\u0440\u0441\u0435\u0440<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0424\u043e\u0440\u043c\u0430\u0442<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0422\u0438\u043f \u043d\u0430\u0445\u043e\u0434\u043e\u043a<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>SARIFParser<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">SARIF 2.1.0<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u0434\u043b\u044f Semgrep, CodeQL \u0438 \u0434\u0440\u0443\u0433\u0438\u0445<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>TrivyParser<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">Trivy JSON<\/p>\n<\/td>\n<td>\n<p align=\"left\">SCA, IaC, secrets<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>GrypeParser<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">Grype JSON<\/p>\n<\/td>\n<td>\n<p align=\"left\">SCA<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>SemgrepParser<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">Semgrep native JSON<\/p>\n<\/td>\n<td>\n<p align=\"left\">SAST<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>GosecParser<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">gosec JSON \/ SARIF<\/p>\n<\/td>\n<td>\n<p align=\"left\">Go SAST<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>ZAPParser<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">ZAP JSON<\/p>\n<\/td>\n<td>\n<p align=\"left\">DAST<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>TruffleHogParser<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">TruffleHog v3: NDJSON \u0438 array<\/p>\n<\/td>\n<td>\n<p align=\"left\">Secrets<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>GitleaksParser<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">Gitleaks JSON<\/p>\n<\/td>\n<td>\n<p align=\"left\">Secrets<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>CheckovParser<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">Checkov JSON<\/p>\n<\/td>\n<td>\n<p align=\"left\">IaC<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>GenericParser<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">Generic JSON<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439 \u0437\u0430\u043f\u0430\u0441\u043d\u043e\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0410\u0432\u0442\u043e\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e: \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0430\u0440\u0441\u0435\u0440 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 <code>CanParse([]byte) bool<\/code> \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u043d\u044b\u0435 \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u0438 \u0441\u0432\u043e\u0435\u0433\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0434\u043b\u044f SARIF:<\/p>\n<pre><code class=\"go\">func (p *SARIFParser) CanParse(data []byte) bool {    var probe struct {        Schema  string `json:\"$schema\"`        Version string `json:\"version\"`    }    if err := json.Unmarshal(data, &amp;probe); err != nil {        return false    }    schema := strings.ToLower(strings.TrimSpace(probe.Schema))    version := strings.TrimSpace(probe.Version)    return strings.Contains(schema, \"sarif\") || version == \"2.1.0\"}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:87px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u043f\u0430\u0440\u0441\u0435\u0440\u044b \u043f\u0440\u043e\u0431\u0443\u044e\u0442\u0441\u044f \u043f\u043e \u043f\u043e\u0440\u044f\u0434\u043a\u0443. \u041f\u0435\u0440\u0432\u044b\u0439, \u043a\u0442\u043e \u0440\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u043b \u0444\u043e\u0440\u043c\u0430\u0442, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0444\u0430\u0439\u043b \u043d\u0430 \u0440\u0430\u0437\u0431\u043e\u0440:<\/p>\n<pre><code class=\"go\">var parsers = []struct {    name   string    parser Parser}{    {\"sarif\", &amp;SARIFParser{}},    {\"trivy\", &amp;TrivyParser{}},    {\"semgrep\", &amp;SemgrepParser{}},    \/\/ ... \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435    {\"generic\", &amp;GenericParser{}},}func DetectAndParse(ctx context.Context, data []byte) (string, []domain.Finding, error) {    for _, p := range parsers {        if p.parser.CanParse(data) {            findings, err := p.parser.Parse(ctx, data)            if err != nil {                return p.name, nil, err            }            return p.name, findings, nil        }    }    return \"\", nil, errors.New(\"unsupported format: no parser matched the input\")}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u0441\u0442\u043e\u0438\u0442 <code>GenericParser<\/code>. \u041e\u043d \u0443\u043c\u0435\u0435\u0442 \u0447\u0438\u0442\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 JSON \u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u043f\u043e\u043b\u0435\u0439 \u0438 \u043d\u0443\u0436\u0435\u043d \u043a\u0430\u043a \u0437\u0430\u043f\u0430\u0441\u043d\u043e\u0439 \u043f\u0443\u0442\u044c \u0434\u043b\u044f \u0441\u0430\u043c\u043e\u043f\u0438\u0441\u043d\u044b\u0445 \u0441\u043a\u0430\u043d\u0435\u0440\u043e\u0432 \u0438\u043b\u0438 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u043f\u043e\u0434 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0435\u0449\u0451 \u043d\u0435\u0442 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u0441\u0435\u0440\u0430.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bc2\/53e\/1be\/bc253e1be11522701456bf2fd7640860.png\" alt=\"\u041d\u0438\u0447\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e, \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 UI\" title=\"\u041d\u0438\u0447\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e, \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 UI\" width=\"2546\" height=\"1223\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/bc2\/53e\/1be\/bc253e1be11522701456bf2fd7640860.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bc2\/53e\/1be\/bc253e1be11522701456bf2fd7640860.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041d\u0438\u0447\u0435\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e, \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 UI<\/figcaption><\/div>\n<\/figure>\n<h3>\u0414\u0435\u0434\u0443\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u044f: \u0433\u0434\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0430\u044f \u0431\u043e\u043b\u044c<\/h3>\n<p>\u0414\u0435\u0434\u0443\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u044f &#8212; \u043e\u0434\u043d\u0430 \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u0432 ASOC. \u041d\u0430 \u0441\u043b\u043e\u0432\u0430\u0445 \u0432\u0441\u0451 \u043f\u0440\u043e\u0441\u0442\u043e: \u0435\u0441\u043b\u0438 \u043d\u0430\u0445\u043e\u0434\u043a\u0430 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c, \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u0442\u043e\u0440\u0443\u044e. \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0441\u0440\u0430\u0437\u0443 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0432\u043e\u043f\u0440\u043e\u0441: \u0430 \u0447\u0442\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0434\u0443\u0431\u043b\u0435\u043c?  <\/p>\n<p>\u0412\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u043c\u043d\u043e\u0433\u043e, \u0438 \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0435\u0441\u0442\u044c \u043c\u0438\u043d\u0443\u0441\u044b:  <\/p>\n<ol>\n<li>\n<p><code><strong>cve + component<\/strong><\/code> &#8212; \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f SCA, \u043d\u043e \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0434\u043b\u044f SAST-\u043d\u0430\u0445\u043e\u0434\u043e\u043a \u0431\u0435\u0437 CVE.  <\/p>\n<\/li>\n<li>\n<p><code><strong>file_path + line<\/strong><\/code> &#8212; \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0434\u043b\u044f \u043a\u043e\u0434\u0430, \u043d\u043e \u043f\u043b\u043e\u0445\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f SCA, \u0433\u0434\u0435 \u043e\u0434\u0438\u043d <code>pom.xml<\/code> \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0440\u043e\u0434\u0438\u0442\u044c \u0434\u0435\u0441\u044f\u0442\u043a\u0438 CVE.  <\/p>\n<\/li>\n<li>\n<p><code><strong>rule_id + file<\/strong><\/code> &#8212; \u0441\u0445\u043b\u043e\u043f\u043d\u0435\u0442 \u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0432 \u043e\u0434\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435.  <\/p>\n<\/li>\n<li>\n<p><strong>\u041f\u043e\u043b\u043d\u044b\u0439 \u0445\u044d\u0448 \u043e\u0442 \u0432\u0441\u0435\u0439 \u043d\u0430\u0445\u043e\u0434\u043a\u0438<\/strong> &#8212; \u043f\u043e\u0447\u0442\u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0441\u0445\u043b\u043e\u043f\u043d\u0435\u0442, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c\u0441\u044f \u043e\u0434\u043d\u043e\u043c\u0443 \u043f\u043e\u043b\u044e.  <\/p>\n<\/li>\n<\/ol>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u044f \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0441\u044f \u043d\u0430 \u0433\u0438\u0431\u0440\u0438\u0434\u043d\u043e\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0435: \u0434\u043b\u044f \u043e\u0442\u043f\u0435\u0447\u0430\u0442\u043a\u0430 \u0431\u0435\u0440\u0443\u0442\u0441\u044f \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u043b\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0445\u043e\u0440\u043e\u0448\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442 \u043f\u0440\u0438\u0440\u043e\u0434\u0443 \u043d\u0430\u0445\u043e\u0434\u043a\u0438, \u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u0440\u043e\u0433\u043e\u043d\u044f\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 SHA256.  <\/p>\n<pre><code class=\"go\">func CalculateFingerprint(f *Finding) string {  var cveID string  if len(f.CVEIDs) &gt; 0 {  cveID = f.CVEIDs[0]  }    var cweID string  if len(f.CWEIDs) &gt; 0 {  cweID = fmt.Sprintf(\"%d\", f.CWEIDs[0])  } else {  cweID = \"0\"  }    var ruleID string  if f.RuleID != nil {  ruleID = *f.RuleID  }    parts := []string{  strconv.Itoa(int(f.Kind)),  strings.ToLower(ruleID),  strings.ToLower(cveID),  strings.ToLower(f.FilePath),  strconv.Itoa(f.LineStart),  strconv.Itoa(f.LineEnd),  cweID,  strings.ToLower(f.Component),  strings.ToLower(f.ComponentVersion),  }    input := strings.Join(parts, \"\\x00\")  h := sha256.Sum256([]byte(input))    return fmt.Sprintf(\"%x\", h)  }<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412\u0430\u0436\u043d\u0430\u044f \u0434\u0435\u0442\u0430\u043b\u044c: \u0432 \u043e\u0442\u043f\u0435\u0447\u0430\u0442\u043e\u043a \u0432\u0445\u043e\u0434\u0438\u0442 <code>Kind<\/code>, \u0442\u043e \u0435\u0441\u0442\u044c \u0442\u0438\u043f \u043d\u0430\u0445\u043e\u0434\u043a\u0438. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443 SCA \u0438 SAST \u043d\u0435 \u0441\u0445\u043b\u043e\u043f\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u0443 \u0437\u0430\u043f\u0438\u0441\u044c, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0443 \u043d\u0438\u0445 \u0441\u043e\u0432\u043f\u0430\u043b CVE. \u042d\u0442\u043e \u0440\u0430\u0437\u043d\u044b\u0435 \u043a\u043b\u0430\u0441\u0441\u044b \u043f\u0440\u043e\u0431\u043b\u0435\u043c, \u0438 \u0430\u043d\u0430\u043b\u0438\u0442\u0438\u043a \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u0438\u0434\u0435\u0442\u044c \u0438\u0445 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e.<\/p>\n<p>\u041f\u0440\u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u043c \u0438\u043c\u043f\u043e\u0440\u0442\u0435, \u0435\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0439 \u043e\u0442\u043f\u0435\u0447\u0430\u0442\u043e\u043a \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u0432 \u0431\u0430\u0437\u0435, \u043d\u043e\u0432\u0430\u044f \u043d\u0430\u0445\u043e\u0434\u043a\u0430 \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f. \u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u043e\u043b\u044f \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u0437\u0430\u043f\u0438\u0441\u0438:<\/p>\n<ul>\n<li>\n<p><code>last_seen = now()<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>times_seen += 1<\/code>.<\/p>\n<\/li>\n<\/ul>\n<p>\u0422\u0430\u043a \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442, \u0447\u0442\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432\u0441\u0451 \u0435\u0449\u0451 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u0430, \u043d\u043e \u043d\u0435 \u0437\u0430\u0441\u043e\u0440\u044f\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c\u0438 \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438.<\/p>\n<p>\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0432\u0435\u0434\u0451\u0442\u0441\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 <code>finding_events<\/code>: \u0441\u043c\u0435\u043d\u0430 \u0441\u0442\u0430\u0442\u0443\u0441\u0430, \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e, \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f. \u042d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430, \u043d\u043e \u0438 \u0434\u043b\u044f \u0430\u0443\u0434\u0438\u0442\u0430. \u0412\u043e\u043f\u0440\u043e\u0441 \u201c\u043a\u0442\u043e, \u043a\u043e\u0433\u0434\u0430 \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u0437\u0430\u043a\u0440\u044b\u043b \u044d\u0442\u0443 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044c\u201d \u0432 \u0442\u0430\u043a\u0438\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e.<\/p>\n<p>\u0414\u043b\u044f \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u043e\u0442\u043f\u0435\u0447\u0430\u0442\u043a\u0430. \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0435\u043a\u0440\u0435\u0442\u0430 \u043d\u0435\u043b\u044c\u0437\u044f \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u0431\u0430\u0437\u0435 \u0432 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u043c \u0432\u0438\u0434\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432 fingerprint \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0445\u044d\u0448 \u043e\u0442 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u043e\u0432, \u0430 \u0441\u0430\u043c \u0441\u0435\u043a\u0440\u0435\u0442 \u0432 \u0411\u0414 \u043d\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ce9\/ccb\/6aa\/ce9ccb6aa2c99a6beae1df4e4c548197.png\" alt=\"\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043d\u0430\u0445\u043e\u0434\u043e\u043a (\u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0435\u0439)\" title=\"\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043d\u0430\u0445\u043e\u0434\u043e\u043a (\u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0435\u0439)\" width=\"2544\" height=\"1210\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/ce9\/ccb\/6aa\/ce9ccb6aa2c99a6beae1df4e4c548197.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ce9\/ccb\/6aa\/ce9ccb6aa2c99a6beae1df4e4c548197.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043d\u0430\u0445\u043e\u0434\u043e\u043a (\u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0435\u0439)<\/figcaption><\/div>\n<\/figure>\n<h3>\u041e\u0431\u043e\u0433\u0430\u0449\u0435\u043d\u0438\u0435: 7 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432, 3 \u0432\u043e\u0440\u043a\u0435\u0440\u0430, Redis Streams<\/h3>\n<p>\u0413\u043e\u043b\u044b\u0439 CVE \u0431\u0435\u0437 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430 \u043f\u043e\u0447\u0442\u0438 \u0431\u0435\u0441\u043f\u043e\u043b\u0435\u0437\u0435\u043d. \u0417\u0430\u043f\u0438\u0441\u044c \u0432\u0438\u0434\u0430 \u201cCVE-2024-XXXXX, High\u201d \u0441\u0430\u043c\u0430 \u043f\u043e \u0441\u0435\u0431\u0435 \u043c\u0430\u043b\u043e \u0447\u0442\u043e \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u0435. \u0414\u0440\u0443\u0433\u043e\u0435 \u0434\u0435\u043b\u043e, \u043a\u043e\u0433\u0434\u0430 \u0440\u044f\u0434\u043e\u043c \u0435\u0441\u0442\u044c EPSS, KEV, \u0411\u0414\u0423 \u0424\u0421\u0422\u042d\u041a, CWE, \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0438 \u0438 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044c \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u043e\u043f\u0430\u0441\u043d\u0430 \u0438\u043c\u0435\u043d\u043d\u043e \u0441\u0435\u0439\u0447\u0430\u0441.<\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: \u201cCVE-2024-XXXXX, High, EPSS 87%, \u0435\u0441\u0442\u044c \u0432 CISA KEV, \u0441\u0440\u043e\u043a \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0447\u0435\u0440\u0435\u0437 5 \u0434\u043d\u0435\u0439, \u0435\u0441\u0442\u044c \u0441\u0432\u044f\u0437\u044c \u0441 \u0411\u0414\u0423 \u0424\u0421\u0422\u042d\u041a\u201d. \u042d\u0442\u043e \u0443\u0436\u0435 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u0442\u0440\u043e\u043a\u0430 \u0432 \u043e\u0442\u0447\u0451\u0442\u0435, \u0430 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<h4>\u041a\u0430\u043a\u0438\u0435 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f<\/h4>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0427\u0442\u043e \u0434\u0430\u0451\u0442<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0427\u0430\u0441\u0442\u043e\u0442\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u041e\u0431\u044a\u0451\u043c<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>NVD API 2.0<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">CVSS v2\/v3.1\/v4.0, \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f, CPE matches, \u0441\u0441\u044b\u043b\u043a\u0438<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043a\u0430\u0436\u0434\u044b\u0435 2 \u0447\u0430\u0441\u0430, \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e<\/p>\n<\/td>\n<td>\n<p align=\"left\">~340k CVE<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>EPSS \/ FIRST<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0412\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438 \u0432 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0438\u0435 30 \u0434\u043d\u0435\u0439<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0435\u0436\u0435\u0434\u043d\u0435\u0432\u043d\u043e<\/p>\n<\/td>\n<td>\n<p align=\"left\">~330k CVE + \u0438\u0441\u0442\u043e\u0440\u0438\u044f<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>CISA KEV<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0423\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u0436\u0435 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043a\u0430\u0436\u0434\u044b\u0435 6 \u0447\u0430\u0441\u043e\u0432<\/p>\n<\/td>\n<td>\n<p align=\"left\">~1.5k \u0437\u0430\u043f\u0438\u0441\u0435\u0439<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>\u0411\u0414\u0423 \u0424\u0421\u0422\u042d\u041a<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0420\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u0438\u0439 \u043a\u0430\u0442\u0430\u043b\u043e\u0433 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0435\u0439, \u0441\u0432\u044f\u0437\u0438 \u0441 CVE \u0438 CWE<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0435\u0436\u0435\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u043e<\/p>\n<\/td>\n<td>\n<p align=\"left\">~87k \u0437\u0430\u043f\u0438\u0441\u0435\u0439<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>OSV<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0423\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0438 \u0432 open-source \u044d\u043a\u043e\u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0435\u0436\u0435\u0434\u043d\u0435\u0432\u043d\u043e<\/p>\n<\/td>\n<td>\n<p align=\"left\">~606k \u0437\u0430\u043f\u0438\u0441\u0435\u0439<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>CWE \/ MITRE<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041a\u043b\u0430\u0441\u0441\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0442\u0438\u043f\u043e\u0432 \u0441\u043b\u0430\u0431\u043e\u0441\u0442\u0435\u0439<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0435\u0436\u0435\u043c\u0435\u0441\u044f\u0447\u043d\u043e<\/p>\n<\/td>\n<td>\n<p align=\"left\">~960 \u0437\u0430\u043f\u0438\u0441\u0435\u0439<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><strong>NVD CPE<\/strong><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0421\u043b\u043e\u0432\u0430\u0440\u044c \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432 \u0438 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c \u0434\u043b\u044f \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0435\u0436\u0435\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u043e<\/p>\n<\/td>\n<td>\n<p align=\"left\">~1.6M \u0437\u0430\u043f\u0438\u0441\u0435\u0439<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0412\u0441\u0435 \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a\u0438 \u0437\u0435\u0440\u043a\u0430\u043b\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e. \u042d\u0442\u043e \u0432\u0430\u0436\u043d\u043e \u0434\u043b\u044f \u0437\u0430\u043a\u0440\u044b\u0442\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0443\u0440\u0430: \u0435\u0441\u043b\u0438 \u0443 \u0440\u0430\u0437\u0432\u0451\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u043d\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442, \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043f\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c\u0443 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u043c\u0443 \u0441\u043b\u0435\u043f\u043a\u0443. \u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f, \u043d\u043e \u043e\u0431\u043e\u0433\u0430\u0449\u0435\u043d\u0438\u0435 \u0438 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u043d\u0435 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044e\u0442\u0441\u044f \u0432 \u0442\u044b\u043a\u0432\u0443.<\/p>\n<h4>\u041a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442<\/h4>\n<p>\u0422\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0431\u043e\u0433\u0430\u0449\u0435\u043d\u0438\u0435 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u043e \u043d\u0430 Redis Streams \u0438 \u0433\u0440\u0443\u043f\u043f\u0435 \u0438\u0437 \u0442\u0440\u0451\u0445 \u0432\u043e\u0440\u043a\u0435\u0440\u043e\u0432. \u041a\u0430\u0436\u0434\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 &#8212; \u044d\u0442\u043e <code>finding_id<\/code>.<\/p>\n<p>\u0412\u043e\u0440\u043a\u0435\u0440 \u0437\u0430\u0431\u0438\u0440\u0430\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u043a\u0443 \u0438\u0437 \u0411\u0414, \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u043f\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u043c \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a\u0430\u043c, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 JSONB-\u043f\u043e\u043b\u044f \u043f\u043e \u043a\u0430\u0436\u0434\u043e\u043c\u0443 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0443 \u0438 \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 <code>priority_score<\/code>.<\/p>\n<p>\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u0443\u044e Kafka \u0434\u043b\u044f \u0442\u0430\u043a\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0442\u0430\u0449\u0438\u0442\u044c \u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c. \u0417\u0434\u0435\u0441\u044c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439: \u0432\u0437\u044f\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c, \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044c. Redis Streams \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0435\u0441\u043b\u0438 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u0436\u0438\u0442\u044c \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u043a\u0435.<\/p>\n<p>\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 <code>XACK<\/code> \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u0415\u0441\u043b\u0438 \u0432\u043e\u0440\u043a\u0435\u0440 \u043f\u0430\u0434\u0430\u0435\u0442 \u043d\u0430 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435, \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043d\u0435\u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0451\u043d\u043d\u044b\u043c \u0438 \u043f\u043e\u0437\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0437\u0430\u0431\u0440\u0430\u043d\u043e \u0434\u0440\u0443\u0433\u0438\u043c \u0432\u043e\u0440\u043a\u0435\u0440\u043e\u043c. \u041f\u043e\u0432\u0442\u043e\u0440\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u0430: \u0438\u0434\u0435\u043c\u043f\u043e\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0411\u0414 \u0447\u0435\u0440\u0435\u0437 <code>INSERT ... ON CONFLICT DO UPDATE<\/code>, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0435 \u043e\u0431\u043e\u0433\u0430\u0449\u0435\u043d\u0438\u0435 \u043d\u0435 \u043b\u043e\u043c\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u043c\u0443\u0441\u043e\u0440.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b6a\/ce9\/7f4\/b6ace97f4b2464bc808d7654142920de.png\" alt=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u043e\u0431\u043e\u0433\u0430\u0449\u0435\u043d\u0438\u044f \u0411\u0414\u0423 \u0424\u0421\u0422\u042d\u041a \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u043d\u0430\u0445\u043e\u0434\u043a\u0435\" title=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u043e\u0431\u043e\u0433\u0430\u0449\u0435\u043d\u0438\u044f \u0411\u0414\u0423 \u0424\u0421\u0422\u042d\u041a \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u043d\u0430\u0445\u043e\u0434\u043a\u0435\" width=\"1313\" height=\"971\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/b6a\/ce9\/7f4\/b6ace97f4b2464bc808d7654142920de.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b6a\/ce9\/7f4\/b6ace97f4b2464bc808d7654142920de.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041f\u0440\u0438\u043c\u0435\u0440 \u043e\u0431\u043e\u0433\u0430\u0449\u0435\u043d\u0438\u044f \u0411\u0414\u0423 \u0424\u0421\u0422\u042d\u041a \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u043d\u0430\u0445\u043e\u0434\u043a\u0435<\/figcaption><\/div>\n<\/figure>\n<h3>\u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0438\u0437\u0430\u0446\u0438\u044f: \u0444\u043e\u0440\u043c\u0443\u043b\u0430, \u0430 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u201ccritical\u201d<\/h3>\n<p>\u0415\u0441\u043b\u0438 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 50k \u043d\u0430\u0445\u043e\u0434\u043e\u043a \u0441\u043e \u0441\u0442\u0430\u0442\u0443\u0441\u043e\u043c <code>critical<\/code>, \u0437\u043d\u0430\u0447\u0438\u0442 \u0441\u0430\u043c\u0430 \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u043e\u0441\u0442\u044c \u0443\u0436\u0435 \u043c\u0430\u043b\u043e \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442. \u041d\u0443\u0436\u043d\u0430 \u043e\u0446\u0435\u043d\u043a\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e severity \u043e\u0442 \u0441\u043a\u0430\u043d\u0435\u0440\u0430, \u043d\u043e \u0438 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442: \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043b\u0438 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044c, \u0435\u0441\u0442\u044c \u043b\u0438 \u043e\u043d\u0430 \u0432 KEV, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u044b\u0441\u043e\u043a\u0438\u0439 EPSS, \u0437\u0430\u0442\u0440\u043e\u043d\u0443\u0442 \u043b\u0438 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u043b\u0438 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435.  <\/p>\n<p>\u0412 Red Lycoris \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u0447\u0438\u0442\u0430\u0435\u0442\u0441\u044f <code>priority_score<\/code>:  <\/p>\n<pre><code>priority_score = cvss_base \u00d7 0.30  + epss \u00d7 100 \u00d7 0.25  + (kev_bonus + urgency_bonus) \u00d7 0.20  + bdu_bonus \u00d7 0.10  + recency \u00d7 0.10  + exposure \u00d7 0.05  + trend_bonus \u00d7 0.05  + fix_bonus \u00d7 0.03<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0413\u0434\u0435:<\/p>\n<ul>\n<li>\n<p><code>cvss_base<\/code> &#8212; \u043d\u0430\u0438\u0432\u044b\u0441\u0448\u0438\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0439 CVSS: v4.0 \u2192 v3.1 \u2192 v2.0;<\/p>\n<\/li>\n<li>\n<p><code>epss \u00d7 100<\/code> &#8212; \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438 \u0432 \u0431\u043b\u0438\u0436\u0430\u0439\u0448\u0438\u0435 30 \u0434\u043d\u0435\u0439, \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d\u043d\u0430\u044f \u043a \u0448\u043a\u0430\u043b\u0435 0..100;<\/p>\n<\/li>\n<li>\n<p><code>kev_bonus<\/code> &#8212; \u0431\u043e\u043d\u0443\u0441 \u0437\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0432 CISA KEV, \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0432\u044f\u0437\u044c \u0441 ransomware;<\/p>\n<\/li>\n<li>\n<p><code>urgency_bonus<\/code> &#8212; \u0447\u0435\u043c \u0431\u043b\u0438\u0436\u0435 KEV-\u0434\u0435\u0434\u043b\u0430\u0439\u043d, \u0442\u0435\u043c \u0432\u044b\u0448\u0435 \u0432\u043a\u043b\u0430\u0434;<\/p>\n<\/li>\n<li>\n<p><code>bdu_bonus<\/code> &#8212; \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0432\u0435\u0441, \u0435\u0441\u043b\u0438 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044c \u0435\u0441\u0442\u044c \u0432 \u0411\u0414\u0423 \u0424\u0421\u0422\u042d\u041a;<\/p>\n<\/li>\n<li>\n<p><code>recency<\/code> &#8212; \u0441\u0432\u0435\u0436\u0435\u0441\u0442\u044c \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0438 \u0441 \u044d\u043a\u0441\u043f\u043e\u043d\u0435\u043d\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u043c \u0437\u0430\u0442\u0443\u0445\u0430\u043d\u0438\u0435\u043c;<\/p>\n<\/li>\n<li>\n<p><code>exposure<\/code> &#8212; \u043a\u043e\u044d\u0444\u0444\u0438\u0446\u0438\u0435\u043d\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0430: \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442, \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u043a\u043e\u043d\u0442\u0443\u0440, \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0441\u0440\u0435\u0434\u0430;<\/p>\n<\/li>\n<li>\n<p><code>trend_bonus<\/code> &#8212; \u0440\u043e\u0441\u0442 EPSS \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u043d\u0435\u0434\u0435\u043b\u044e;<\/p>\n<\/li>\n<li>\n<p><code>fix_bonus<\/code> &#8212; \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e\u0431 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0432 OSV.<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0441\u044b\u0440\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d <code>0..10<\/code>:<\/p>\n<pre><code class=\"go\">raw := baseScore*0.30 +    epssScore*100.0*0.25 +    (kevBonus+urgencyBonus)*0.20 +    bduBonus*0.10 +    recency*0.10 +    exposure*0.05 +    trendBonus*0.05 +    fixBonus*0.03score := (raw \/ maxRaw) * 10.0return math.Min(10.0, math.Max(0.0, math.Round(score*100)\/100))<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0421\u043c\u044b\u0441\u043b \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e CVSS &#8212; \u044d\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0430\u0441\u0442\u044c \u043e\u0446\u0435\u043d\u043a\u0438, \u0430 \u043d\u0435 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u043f\u0440\u0430\u0432\u0434\u044b. CVE \u0441 <code>CVSS 9.8<\/code>, \u043d\u043e \u043f\u043e\u0447\u0442\u0438 \u043d\u0443\u043b\u0435\u0432\u044b\u043c EPSS, \u0431\u0435\u0437 KEV \u0438 \u0431\u0435\u0437 \u043f\u0440\u0438\u0437\u043d\u0430\u043a\u043e\u0432 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438, \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u0439 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438. \u0410 \u0432\u043e\u0442 <code>Medium<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u0436\u0435 \u043f\u043e\u043f\u0430\u043b \u0432 KEV \u0438 \u0438\u043c\u0435\u0435\u0442 \u0434\u0435\u0434\u043b\u0430\u0439\u043d \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u043d\u0435\u0439, \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0442\u044c\u0441\u044f \u0432\u044b\u0448\u0435.<\/p>\n<h4>\u0412\u0438\u0442\u0440\u0438\u043d\u0430 \u0434\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u044b\u0445 \u0441\u043f\u0438\u0441\u043a\u043e\u0432<\/h4>\n<p>\u0421\u0447\u0438\u0442\u0430\u0442\u044c \u044d\u0442\u0443 \u0444\u043e\u0440\u043c\u0443\u043b\u0443 \u043d\u0430 \u043b\u0435\u0442\u0443 \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0438 \u0441\u043f\u0438\u0441\u043a\u0430 \u043d\u0430\u0445\u043e\u0434\u043e\u043a &#8212; \u043f\u043b\u043e\u0445\u0430\u044f \u0438\u0434\u0435\u044f. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u0442\u043e\u0433\u043e\u0432\u044b\u0439 <code>priority_score<\/code> \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0438 \u043f\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043e\u0431\u043e\u0433\u0430\u0449\u0435\u043d\u0438\u0438 \u043d\u0430\u0445\u043e\u0434\u043a\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0444\u043e\u043d\u043e\u0432\u044b\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u043c.<\/p>\n<p>\u0414\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u044d\u0442\u043e \u0443\u0436\u0435 \u0433\u043e\u0442\u043e\u0432\u0430\u044f \u0432\u0438\u0442\u0440\u0438\u043d\u0430: \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u043e <code>priority_score DESC<\/code>, \u0431\u0435\u0437 \u0442\u044f\u0436\u0451\u043b\u043e\u0439 \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0438 \u043d\u0430 \u0433\u043e\u0440\u044f\u0447\u0435\u043c \u043f\u0443\u0442\u0438. \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0438 \u0441\u0440\u0430\u0437\u0443 \u0432\u0438\u0434\u0438\u0442 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u201ccritical \u043e\u0442 \u0441\u043a\u0430\u043d\u0435\u0440\u0430\u201d, \u0430 \u043f\u043e\u0440\u044f\u0434\u043e\u043a, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043d\u0430\u0445\u043e\u0434\u043a\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0442\u043e\u0438\u0442 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c.<\/p>\n<figure class=\"\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e3c\/a55\/246\/e3ca5524678269c61f1ed7bc31215829.png\" alt=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0441\u0447\u0435\u0442 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u0430\" title=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0441\u0447\u0435\u0442 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u0430\" width=\"385\" height=\"275\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/e3c\/a55\/246\/e3ca5524678269c61f1ed7bc31215829.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e3c\/a55\/246\/e3ca5524678269c61f1ed7bc31215829.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u041f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0441\u0447\u0435\u0442 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u0430<\/figcaption><\/div>\n<\/figure>\n<h3>\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c: \u0447\u0442\u043e \u044f \u0432\u044b\u043d\u0435\u0441<\/h3>\n<p>\u042d\u0442\u043e, \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435, \u0441\u0430\u043c\u0430\u044f \u0431\u043e\u043b\u0435\u0437\u043d\u0435\u043d\u043d\u0430\u044f \u0438 \u0441\u0430\u043c\u0430\u044f \u043f\u043e\u043b\u0435\u0437\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u0430.  <\/p>\n<h4>\u041a\u0443\u0440\u0441\u043e\u0440\u043d\u0430\u044f \u043f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u044f \u0432\u043c\u0435\u0441\u0442\u043e OFFSET<\/h4>\n<p>\u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u044f \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:  <\/p>\n<pre><code class=\"sql\">SELECT *  FROM findings  WHERE project_id = $1  ORDER BY created_at DESC  LIMIT 50 OFFSET 50000;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0440\u0438 \u0431\u043e\u043b\u044c\u0448\u043e\u043c <code>OFFSET<\/code> PostgreSQL \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u0440\u043e\u0439\u0442\u0438 \u043b\u0438\u0448\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a\u0438: \u043d\u0430\u0439\u0442\u0438 \u043f\u0435\u0440\u0432\u044b\u0435 <code>50000 + 50<\/code>, \u043e\u0442\u0431\u0440\u043e\u0441\u0438\u0442\u044c 50000 \u0438 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e 50. \u041d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0445 \u044d\u0442\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043d\u0435\u043f\u0440\u0438\u044f\u0442\u043d\u0443\u044e \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435.<\/p>\n<p>\u0412\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u043a\u0443\u0440\u0441\u043e\u0440\u043d\u0443\u044e \u043f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u044e, \u043e\u043d\u0430 \u0436\u0435 keyset pagination:<\/p>\n<pre><code class=\"sql\">SELECT *FROM findingsWHERE project_id = $1  AND (first_seen, id) &lt; ($cursor_first_seen, $cursor_id)ORDER BY first_seen DESC, id DESCLIMIT 51; -- +1, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c, \u0435\u0441\u0442\u044c \u043b\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041a\u0443\u0440\u0441\u043e\u0440 &#8212; \u044d\u0442\u043e base64-\u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 JSON \u0441 \u0434\u0432\u0443\u043c\u044f \u043f\u043e\u043b\u044f\u043c\u0438:<\/p>\n<pre><code class=\"go\">type findingsCursor struct {    FirstSeen time.Time `json:\"first_seen\"`    ID        uuid.UUID `json:\"id\"`}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0434 \u0442\u0430\u043a\u043e\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0443\u0436\u0435\u043d \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u043e\u0439 \u0438\u043d\u0434\u0435\u043a\u0441:<\/p>\n<pre><code class=\"sql\">CREATE INDEX idx_findings_project_first_seen_id    ON findings (project_id, first_seen DESC, id DESC);<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u043b\u0438\u0441\u0442\u0430\u043d\u0438\u044f \u043f\u043e\u0447\u0442\u0438 \u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043d\u043e\u043c\u0435\u0440\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b: \u0431\u0430\u0437\u0430 \u0438\u0434\u0451\u0442 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 \u0438 \u0437\u0430\u0431\u0438\u0440\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 50 \u0441\u0442\u0440\u043e\u043a, \u0430 \u043d\u0435 \u043f\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0451 \u0441 \u043d\u0430\u0447\u0430\u043b\u0430. \u041d\u0430 dev-\u0441\u0442\u0435\u043d\u0434\u0435 \u0441 1M \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0441\u0435\u0440\u0432\u0435\u0440\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0443\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u043b\u0430\u0441\u044c \u0432 \u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0431\u0435\u0437 \u043e\u0449\u0443\u0449\u0435\u043d\u0438\u044f, \u0447\u0442\u043e \u201c\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 1000\u201d \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u044b\u0442\u043a\u0443.<\/p>\n<p>\u041c\u0438\u043d\u0443\u0441 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0439: \u043d\u0435\u043b\u044c\u0437\u044f \u043c\u0433\u043d\u043e\u0432\u0435\u043d\u043d\u043e \u043f\u0440\u044b\u0433\u043d\u0443\u0442\u044c \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 1000. \u041d\u043e \u0434\u043b\u044f ASOC \u044d\u0442\u043e \u043f\u043e\u0447\u0442\u0438 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e. \u0412 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0444\u0438\u043b\u044c\u0442\u0440\u0443\u0435\u0442, \u0441\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u0442 \u0438 \u0438\u0449\u0435\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u043d\u0430\u0445\u043e\u0434\u043a\u0438, \u0430 \u043d\u0435 \u043b\u0438\u0441\u0442\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043a\u0430\u043a \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u043d\u0443\u044e \u043a\u043d\u0438\u0433\u0443.<\/p>\n<h4>pgx\/v5 + \u0447\u0438\u0441\u0442\u044b\u0439 SQL, \u0431\u0435\u0437 ORM<\/h4>\n<p>\u042d\u0442\u043e\u0442 \u043f\u0443\u043d\u043a\u0442 \u043e\u0431\u044b\u0447\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u0441\u043f\u043e\u0440\u043e\u0432.<\/p>\n<p>ORM \u0443\u0434\u043e\u0431\u0435\u043d, \u043a\u043e\u0433\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0438\u043f\u043e\u0432\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438: \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u044c \u043f\u043e ID, \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c, \u0443\u0434\u0430\u043b\u0438\u0442\u044c, \u043f\u043e\u0434\u0442\u044f\u043d\u0443\u0442\u044c \u0441\u0432\u044f\u0437\u0438. \u041d\u043e \u0432 \u043c\u043e\u0451\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 &#8212; \u044d\u0442\u043e \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u0441 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u043c\u0438, JOIN, \u0444\u0430\u0441\u0435\u0442\u0430\u043c\u0438, \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0430\u043c\u0438 \u0438 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u043e\u0439 \u043f\u043e \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u043d\u044b\u043c \u043f\u043e\u043b\u044f\u043c.<\/p>\n<p>\u041d\u0430 \u0442\u0430\u043a\u0438\u0445 \u0437\u0430\u0434\u0430\u0447\u0430\u0445 ORM \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u043c\u0435\u0448\u0430\u0442\u044c:<\/p>\n<ol>\n<li>\n<p>\u041f\u0440\u043e\u0441\u0442\u0430\u044f \u0441\u0442\u0440\u043e\u0447\u043a\u0430 \u0432 \u043a\u043e\u0434\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043a \u0431\u0430\u0437\u0435.<\/p>\n<\/li>\n<li>\n<p>\u0421\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a\u043e\u0439 SQL \u0440\u0435\u0430\u043b\u044c\u043d\u043e \u0443\u0448\u0451\u043b \u0432 PostgreSQL.<\/p>\n<\/li>\n<li>\n<p>\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u0431\u043e\u0440\u044c\u0431\u0443 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0441 \u0431\u0430\u0437\u043e\u0439, \u043d\u043e \u0438 \u0441 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0435\u0439 \u043f\u043e\u0432\u0435\u0440\u0445 \u043d\u0435\u0451.<\/p>\n<\/li>\n<\/ol>\n<p>\u0421 <code>pgx\/v5<\/code> \u0432\u0441\u0451 \u043f\u0440\u044f\u043c\u043e\u043b\u0438\u043d\u0435\u0439\u043d\u043e: \u043a\u0430\u043a\u043e\u0439 SQL \u043d\u0430\u043f\u0438\u0441\u0430\u043b, \u0442\u0430\u043a\u043e\u0439 \u0438 \u0443\u0448\u0451\u043b \u0432 \u0431\u0430\u0437\u0443.<\/p>\n<pre><code class=\"sql\">const q = `    SELECT f.id, f.title, f.severity, f.status,           fs.priority_score, fs.is_kev, fs.is_bdu,           p.name AS project_name    FROM findings f    LEFT JOIN finding_scores fs ON fs.finding_id = f.id    LEFT JOIN projects p ON p.id = f.project_id    WHERE f.project_id = $1      AND f.severity = ANY($2)      AND (f.first_seen, f.id) &lt; ($3, $4)    ORDER BY f.first_seen DESC, f.id DESC    LIMIT $5`rows, err := r.pool.Query(    ctx,    q,    projectID,    severities,    cursor.FirstSeen,    cursor.ID,    limit,)<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041d\u0438\u043a\u0430\u043a\u043e\u0439 \u0441\u043a\u0440\u044b\u0442\u043e\u0439 \u043c\u0430\u0433\u0438\u0438. \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0440\u043e\u0441 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u044b\u0439, \u044f \u0431\u0435\u0440\u0443 \u0435\u0433\u043e, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e <code>EXPLAIN ANALYZE<\/code>, \u0441\u043c\u043e\u0442\u0440\u044e \u043f\u043b\u0430\u043d \u0438 \u043f\u0440\u0430\u0432\u043b\u044e SQL \u0438\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441\u044b. \u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0441\u0445\u0435\u043c\u044b &#8212; \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f SQL-\u043c\u0438\u0433\u0440\u0430\u0446\u0438\u044f, \u0430 \u043d\u0435 \u043f\u043e\u0431\u043e\u0447\u043d\u044b\u0439 \u044d\u0444\u0444\u0435\u043a\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043c\u043e\u0434\u0435\u043b\u0438.<\/p>\n<h4>\u0418\u043d\u0434\u0435\u043a\u0441\u044b \u043f\u043e\u0434 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b<\/h4>\n<p>\u042f \u043d\u0435 \u0441\u0442\u0430\u043b \u0434\u0435\u043b\u0430\u0442\u044c \u201c\u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043d\u0430 \u0432\u0441\u0451\u201d. \u041a\u0430\u0436\u0434\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043c\u0435\u0441\u0442\u043e, \u0437\u0430\u043c\u0435\u0434\u043b\u044f\u0435\u0442 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f, \u0430 \u0438\u043d\u043e\u0433\u0434\u0430 \u0435\u0449\u0451 \u0438 \u043f\u0443\u0442\u0430\u0435\u0442 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0449\u0438\u043a. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u043b\u0438\u0441\u044c \u043f\u043e\u0434 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0438 API.<\/p>\n<pre><code class=\"sql\">-- \u041a\u0443\u0440\u0441\u043e\u0440\u043d\u0430\u044f \u043f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u044fCREATE INDEX idx_findings_project_first_seen_id    ON findings (project_id, first_seen DESC, id DESC);-- \u0424\u0430\u0441\u0435\u0442\u043d\u0430\u044f \u0430\u0433\u0440\u0435\u0433\u0430\u0446\u0438\u044f \u043f\u043e \u0442\u0438\u043f\u0443, \u0441\u0442\u0430\u0442\u0443\u0441\u0443 \u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0443CREATE INDEX idx_findings_kind_status_project    ON findings (finding_kind, status, project_id);-- \u0427\u0430\u0441\u0442\u0438\u0447\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u0434\u043b\u044f \u043d\u0430\u0445\u043e\u0434\u043e\u043a \u0441 CVECREATE INDEX idx_findings_has_cve    ON findings (id)    WHERE cve_ids IS NOT NULL AND array_length(cve_ids, 1) &gt; 0;-- \u0427\u0430\u0441\u0442\u0438\u0447\u043d\u044b\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u0434\u043b\u044f \u043d\u0430\u0445\u043e\u0434\u043e\u043a \u0441 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043cCREATE INDEX idx_findings_fixed_version_present    ON findings (id)    WHERE fixed_version IS NOT NULL;<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u0427\u0430\u0441\u0442\u0438\u0447\u043d\u044b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0437\u0434\u0435\u0441\u044c \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043f\u043e\u043b\u0435\u0437\u043d\u044b. \u0415\u0441\u043b\u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0443 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0445\u043e\u0434\u043e\u043a \u0438\u043c\u0435\u044e\u0442 CVE \u0438\u043b\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0439 \u0444\u0438\u043a\u0441, \u0431\u0430\u0437\u0435 \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u0432\u0441\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443. \u041e\u043d\u0430 \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0438\u0439 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0438\u043d\u0434\u0435\u043a\u0441 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e \u043d\u0443\u0436\u043d\u043e\u043c\u0443 \u043f\u043e\u0434\u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0443 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>\u0413\u043b\u0430\u0432\u043d\u044b\u0439 \u0432\u044b\u0432\u043e\u0434 \u043f\u0440\u043e\u0441\u0442\u043e\u0439: \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u043d\u0435 \u0438\u0437-\u0437\u0430 \u043e\u0434\u043d\u043e\u0433\u043e \u201c\u0441\u0435\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e\u201d \u043f\u0440\u0438\u0451\u043c\u0430, \u0430 \u0438\u0437-\u0437\u0430 \u043d\u0430\u0431\u043e\u0440\u0430 \u0441\u043a\u0443\u0447\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 &#8212; \u043a\u0443\u0440\u0441\u043e\u0440\u043d\u0430\u044f \u043f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u044f, \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0439 SQL, \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u043f\u043e\u0434 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043b\u0438\u0448\u043d\u0438\u0445 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0439 \u043d\u0430 \u0433\u043e\u0440\u044f\u0447\u0435\u043c \u043f\u0443\u0442\u0438.<\/p>\n<h3>\u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c \u0441\u0430\u043c\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b<\/h3>\n<p>ASOC \u0441\u0430\u043c \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0447\u0430\u0441\u0442\u044c\u044e security-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0442\u0440\u0430\u043d\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u044c\u0441\u044f \u043a \u0435\u0433\u043e \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u043f\u043e \u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u043c\u0443 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443. \u041f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u0445\u0440\u0430\u043d\u0438\u0442 \u0447\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435: \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0439, \u0441\u0435\u043a\u0440\u0435\u0442\u044b \u0432 \u043e\u0442\u0447\u0451\u0442\u0430\u0445, \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0435\u0439, \u0441\u0442\u0430\u0442\u0443\u0441\u044b, \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.  <\/p>\n<h4>\u0410\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f<\/h4>\n<p>\u0414\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f cookie-\u0441\u0435\u0441\u0441\u0438\u0438:  <\/p>\n<pre><code class=\"bash\">Set-Cookie: rl_session=&lt;opaque_token&gt;; HttpOnly; Secure; SameSite=Strict; Path=\/<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<ul>\n<li>\n<p><code>HttpOnly<\/code> &#8212; cookie \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0438\u0437 JavaScript \u0438 \u0445\u0443\u0436\u0435 \u043a\u0440\u0430\u0434\u0451\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 XSS.<\/p>\n<\/li>\n<li>\n<p><code>Secure<\/code> &#8212; \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e HTTPS.<\/p>\n<\/li>\n<li>\n<p><code>SameSite=Strict<\/code> &#8212; \u0441\u043d\u0438\u0436\u0430\u0435\u0442 \u0440\u0438\u0441\u043a CSRF-\u0430\u0442\u0430\u043a.<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u043b\u044f CI\/CD \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f Bearer-\u0442\u043e\u043a\u0435\u043d\u044b. \u041e\u043d\u0438 \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043a \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0443, \u043c\u043e\u0433\u0443\u0442 \u0438\u043c\u0435\u0442\u044c \u0441\u0440\u043e\u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0438 \u0440\u043e\u0442\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441.<\/p>\n<p>\u041f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0439 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0438\u0437 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f:<\/p>\n<pre><code class=\"go\">BOOTSTRAP_ADMIN_EMAIL=BOOTSTRAP_ADMIN_PASSWORD=<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0432\u0445\u043e\u0434\u0430 \u043f\u0430\u0440\u043e\u043b\u044c \u043d\u0443\u0436\u043d\u043e \u0441\u043c\u0435\u043d\u0438\u0442\u044c. \u042d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0437\u0430\u0449\u0438\u0442\u0430 \u043e\u0442 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438, \u043a\u043e\u0433\u0434\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 bootstrap-\u043f\u0430\u0440\u043e\u043b\u044c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u044b\u043c.<\/p>\n<p>\u0414\u043b\u044f \u0432\u0445\u043e\u0434\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 rate limit: 5 \u043f\u043e\u043f\u044b\u0442\u043e\u043a \u0437\u0430 15 \u043c\u0438\u043d\u0443\u0442 \u043d\u0430 \u043f\u0430\u0440\u0443 <code>IP + email<\/code>. \u041f\u0440\u0438 \u043f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0438 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <code>HTTP 429<\/code> \u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a <code>Retry-After<\/code>.<\/p>\n<p>\u041f\u0430\u0440\u043e\u043b\u0438 \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 <code>bcrypt<\/code>. \u041d\u0438\u043a\u0430\u043a\u0438\u0445 MD5, SHA1 \u0438\u043b\u0438 \u0441\u0430\u043c\u043e\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u201c\u0431\u044b\u0441\u0442\u0440\u044b\u0445\u201d \u0441\u0445\u0435\u043c.<\/p>\n<h4>\u0420\u043e\u043b\u0435\u0432\u043e\u0439 \u0434\u043e\u0441\u0442\u0443\u043f<\/h4>\n<p>\u0412 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u0432\u0443\u0445\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u0430: \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u0440\u043e\u043b\u0438 \u0438 \u0440\u043e\u043b\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430.  <\/p>\n<p>\u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u0440\u043e\u043b\u0438:  <\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u0420\u043e\u043b\u044c<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>admin<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u043e\u043b\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>auditor<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u043d\u0430\u0445\u043e\u0434\u043e\u043a, \u0436\u0443\u0440\u043d\u0430\u043b \u0430\u0443\u0434\u0438\u0442\u0430 \u0438 \u044d\u043a\u0441\u043f\u043e\u0440\u0442<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>member<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u043d\u0430\u0445\u043e\u0434\u043a\u0430\u043c\u0438 \u0432 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>viewer<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0422\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0432 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0420\u043e\u043b\u0438 \u0432\u043d\u0443\u0442\u0440\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430:  <\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u0420\u043e\u043b\u044c<\/p>\n<\/th>\n<th>\n<p align=\"left\">\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435<\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>viewer<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>triager<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u0442\u0443\u0441\u043e\u0432, \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445, \u0438\u043c\u043f\u043e\u0440\u0442<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>project_admin<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u0430\u043c\u0438, \u0442\u043e\u043a\u0435\u043d\u0430\u043c\u0438 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u041e\u0434\u0438\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u043c \u0432 \u043e\u0434\u043d\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435, triager \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u0438 viewer \u0432 \u0442\u0440\u0435\u0442\u044c\u0435\u043c. \u041d\u0430 \u0443\u0440\u043e\u0432\u043d\u0435 \u0411\u0414 \u044d\u0442\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 <code>user_project_roles(user_id, project_id, role)<\/code>.  <\/p>\n<h4>\u0417\u0430\u0449\u0438\u0442\u0430 \u043e\u0442 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0445 \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439<\/h4>\n<p>\u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u044b \u043e\u0442 \u201c\u0441\u0430\u043c \u0441\u0435\u0431\u0435 \u043e\u0442\u0441\u0442\u0440\u0435\u043b\u0438\u043b \u043d\u043e\u0433\u0443\u201d:  <\/p>\n<ul>\n<li>\n<p>\u043d\u0435\u043b\u044c\u0437\u044f \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u043b\u0438 \u043f\u043e\u043d\u0438\u0437\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430;  <\/p>\n<\/li>\n<li>\n<p>\u043d\u0435\u043b\u044c\u0437\u044f \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430;  <\/p>\n<\/li>\n<li>\n<p>\u043f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0439 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440 \u043e\u0431\u044f\u0437\u0430\u043d \u0441\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c \u043f\u0440\u0438 \u043f\u0435\u0440\u0432\u043e\u043c \u0432\u0445\u043e\u0434\u0435;  <\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u0438 \u0441\u043c\u0435\u043d\u0435 \u043f\u0430\u0440\u043e\u043b\u044f \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432\u0441\u0435 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0441\u0435\u0441\u0441\u0438\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.  <\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u0435\u0440\u0435\u0434 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435\u043c \u0438\u043b\u0438 \u043f\u043e\u043d\u0438\u0436\u0435\u043d\u0438\u0435\u043c \u0440\u043e\u043b\u0438 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0447\u0442\u043e \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u0438\u043d \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440: <code>CountActiveAdmins() &gt; 1<\/code>. \u0414\u043b\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430.  <\/p>\n<h4>\u0416\u0443\u0440\u043d\u0430\u043b \u0430\u0443\u0434\u0438\u0442\u0430<\/h4>\n<p>\u0412\u0441\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u044e\u0449\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043f\u0438\u0448\u0443\u0442\u0441\u044f \u0432 <code>audit_log<\/code>: \u043a\u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435, \u043a\u043e\u0433\u0434\u0430, \u043d\u0430\u0434 \u043a\u0430\u043a\u043e\u0439 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c\u044e \u0438 \u0447\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u043e\u0441\u044c. \u0414\u043b\u044f \u0447\u0430\u0441\u0442\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u201c\u0434\u043e\u201d \u0438 \u201c\u043f\u043e\u0441\u043b\u0435\u201d, \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0440\u0435\u0448\u0435\u043d\u0438\u044f.  <\/p>\n<p>\u042d\u0442\u043e \u0432\u0430\u0436\u043d\u043e \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438, \u043d\u043e \u0438 \u0434\u043b\u044f \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438. \u0412\u043e\u043f\u0440\u043e\u0441 \u201c\u043a\u0442\u043e \u0437\u0430\u043a\u0440\u044b\u043b \u044d\u0442\u0443 \u043d\u0430\u0445\u043e\u0434\u043a\u0443 \u0438 \u043f\u043e\u0447\u0435\u043c\u0443?\u201d \u0432 AppSec \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e.  <\/p>\n<h4>\u0427\u0442\u043e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u043d\u0435 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442<\/h4>\n<p>\u0417\u0434\u0435\u0441\u044c \u0432\u0430\u0436\u043d\u043e \u0431\u044b\u0442\u044c \u0447\u0435\u0441\u0442\u043d\u044b\u043c: ASOC &#8212; \u044d\u0442\u043e \u043d\u0435 \u043c\u0430\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043a\u0443\u043f\u043e\u043b \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0432\u043e\u043a\u0440\u0443\u0433 \u0441\u0430\u043c\u043e\u0433\u043e \u0441\u0435\u0431\u044f.  <\/p>\n<ul>\n<li>\n<p>\u0421\u0435\u0442\u0435\u0432\u043e\u0439 \u043f\u0435\u0440\u0438\u043c\u0435\u0442\u0440 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0437\u0430\u0434\u0430\u0447\u0435\u0439 <code>nginx<\/code>, firewall \u0438 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u044b\u0445 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a.  <\/p>\n<\/li>\n<li>\n<p>TLS \u043e\u0431\u044b\u0447\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u043c \u043f\u0440\u043e\u043a\u0441\u0438.  <\/p>\n<\/li>\n<li>\n<p>MFA \u043f\u043e\u043a\u0430 \u043d\u0435\u0442, \u044d\u0442\u043e \u0437\u0430\u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u043d\u0430 <code>0.4.0<\/code>.  <\/p>\n<\/li>\n<li>\n<p>\u0421\u0435\u043a\u0440\u0435\u0442\u044b \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0439 \u043b\u0443\u0447\u0448\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432\u043e \u0432\u043d\u0435\u0448\u043d\u0435\u043c Vault, \u0430 \u043d\u0435 \u0432 <code>.env<\/code>.  <\/p>\n<\/li>\n<li>\n<p>Supply chain \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043d\u0435 \u0437\u0430\u043a\u0440\u044b\u0442: \u0435\u0441\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043e\u0431\u0440\u0430\u0437\u044b \u0438\u0437 Docker Hub, \u0434\u043b\u044f \u0437\u0430\u043a\u0440\u044b\u0442\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0443\u0440\u0430 \u043d\u0443\u0436\u043d\u043e \u0441\u0432\u043e\u0451 \u0437\u0435\u0440\u043a\u0430\u043b\u043e \u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u043e\u0432.  <\/p>\n<\/li>\n<\/ul>\n<p>\u041c\u043e\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u0430\u044f: \u0435\u0441\u043b\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e \u043c\u043e\u0434\u0435\u043b\u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u043c\u0435\u043d\u044c\u0448\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u043c\u043e\u0434\u0435\u043b\u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0435\u0449\u0451 \u043d\u0435\u0442.<\/p>\n<figure class=\"full-width \"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f57\/d11\/746\/f57d1174629b8e394cdc348519e53f86.png\" alt=\"\u0421\u0430\u043c\u0430\u044f \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\" title=\"\u0421\u0430\u043c\u0430\u044f \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\" width=\"2550\" height=\"1240\" sizes=\"auto, (max-width: 780px) 100vw, 50vw\" srcset=\"https:\/\/habrastorage.org\/r\/w780\/getpro\/habr\/upload_files\/f57\/d11\/746\/f57d1174629b8e394cdc348519e53f86.png 780w,&#10;       https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f57\/d11\/746\/f57d1174629b8e394cdc348519e53f86.png 781w\" loading=\"lazy\" decode=\"async\"\/><\/p>\n<div><figcaption>\u0421\u0430\u043c\u0430\u044f \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f<\/figcaption><\/div>\n<\/figure>\n<h3>\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441: \u0434\u0438\u0437\u0430\u0439\u043d \u0431\u0435\u0437 \u0431\u043e\u043b\u0438<\/h3>\n<p>\u041a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0430\u044f \u0447\u0430\u0441\u0442\u044c &#8212; \u044d\u0442\u043e React 18, TypeScript strict, TanStack Query\/Table\/Virtual, Tailwind CSS \u0438 shadcn\/ui. \u0422\u0451\u043c\u043d\u0430\u044f \u0442\u0435\u043c\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0430\u043a\u0446\u0435\u043d\u0442\u043d\u044b\u0439 \u0446\u0432\u0435\u0442 &#8212; <code>#930000<\/code>, \u043e\u0442\u0442\u0435\u043d\u043e\u043a \u043a\u0440\u0430\u0441\u043d\u043e\u0433\u043e \u043b\u0438\u043a\u043e\u0440\u0438\u0441\u0430. \u041e\u0441\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0430\u043b\u0438\u0442\u0440\u0430 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043d\u0435\u0439\u0442\u0440\u0430\u043b\u044c\u043d\u0430\u044f: \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043f\u043e\u0440\u0438\u0442\u044c \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.<\/p>\n<p>\u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u0434\u043b\u044f \u0441\u0435\u0431\u044f \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043b:<\/p>\n<ol>\n<li>\n<p><code><strong>#930000<\/strong><\/code><strong> \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f \u0433\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.<\/strong><br \/> \u041e\u0434\u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430, \u0432\u0441\u0451 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 &#8212; \u043d\u0435\u0439\u0442\u0440\u0430\u043b\u044c\u043d\u043e\u0435. \u0422\u0430\u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043f\u0440\u043e\u0449\u0435 \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0443\u0434\u0430 \u043d\u0430\u0436\u0438\u043c\u0430\u0442\u044c.<\/p>\n<\/li>\n<li>\n<p><strong>\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u0430\u0434\u0440\u0435\u0441\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0435.<\/strong><br \/> \u041c\u043e\u0436\u043d\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u0443\u044e \u0432\u044b\u0431\u043e\u0440\u043a\u0443 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443 \u043a\u043e\u043b\u043b\u0435\u0433\u0435: \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u201c\u0432\u043e\u0442 \u044d\u0442\u0438 critical-\u043d\u0430\u0445\u043e\u0434\u043a\u0438 \u0441 KEV-\u0434\u0435\u0434\u043b\u0430\u0439\u043d\u043e\u043c \u043c\u0435\u043d\u044c\u0448\u0435 \u043d\u0435\u0434\u0435\u043b\u0438\u201d. \u0414\u043b\u044f AppSec-\u0440\u0430\u0437\u0431\u043e\u0440\u0430 \u044d\u0442\u043e \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u0434\u043e\u0431\u043d\u0435\u0435, \u0447\u0435\u043c \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0442\u044c \u0444\u0438\u043b\u044c\u0442\u0440\u044b \u0441\u043b\u043e\u0432\u0430\u043c\u0438.<\/p>\n<\/li>\n<li>\n<p><strong>\u0412\u0441\u0451, \u0447\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0435 50 \u0441\u0442\u0440\u043e\u043a, \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442\u0441\u044f.<\/strong><br \/> \u0411\u043e\u043b\u044c\u0448\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0443\u0431\u0438\u0432\u0430\u0442\u044c \u0431\u0440\u0430\u0443\u0437\u0435\u0440. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f TanStack Virtual, \u0430 \u0432\u044b\u0441\u043e\u0442\u0430 \u0441\u0442\u0440\u043e\u043a \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0437\u0430\u0440\u0430\u043d\u0435\u0435.<\/p>\n<\/li>\n<li>\n<p><strong>\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 &#8212; \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0435\u0440\u0435\u0437 TanStack Query.<\/strong><br \/> \u041d\u0438\u043a\u0430\u043a\u0438\u0445 \u0440\u0443\u0447\u043d\u044b\u0445 <code>useEffect<\/code> \u0434\u043b\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432. \u042d\u0442\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0432 <a href=\"http:\/\/CLAUDE.md\" rel=\"noopener noreferrer nofollow\"><code>CLAUDE.md<\/code><\/a>, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044f \u0441\u0430\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u043d\u0430\u0440\u0443\u0448\u0430\u043b \u0435\u0433\u043e \u201c\u043f\u043e-\u0431\u044b\u0441\u0442\u0440\u043e\u043c\u0443\u201d &#8212; \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043f\u043e\u0442\u043e\u043c \u043d\u0430\u0445\u043e\u0434\u0438\u043b \u043b\u0438\u0448\u043d\u0438\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u0438\u043b\u0438 \u0441\u0442\u0440\u0430\u043d\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438.<\/p>\n<\/li>\n<\/ol>\n<p>\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0435\u0449\u0451 \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u0448\u043b\u0438\u0444\u0443\u0435\u0442\u0441\u044f. \u0415\u0441\u043b\u0438 \u043d\u0430 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u0430\u0445 \u0447\u0442\u043e-\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043d\u0435\u0438\u0434\u0435\u0430\u043b\u044c\u043d\u043e, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u044d\u0442\u043e \u0443\u0436\u0435 \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u043d\u0430 \u043f\u0435\u0440\u0435\u0434\u0435\u043b\u043a\u0443.<\/p>\n<h3>\u0420\u0430\u0437\u0432\u0451\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435<\/h3>\n<p>\u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u0440\u0430\u0437\u0432\u0451\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f &#8212; \u043e\u0434\u043d\u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u043a\u0430 \u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043c\u0430\u043d\u0434:<\/p>\n<pre><code class=\"bash\">git clone https:\/\/github.com\/nefrit0n\/red-lycoris.gitcd red-lycoriscp env.example .env# \u0417\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c POSTGRES_PASSWORD, BOOTSTRAP_ADMIN_EMAIL, BOOTSTRAP_ADMIN_PASSWORDdocker compose build --no-cachedocker compose -f docker-compose.yml -f docker-compose.prod.yml up -d<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><img style=\"width:14px;height:14px;object-fit:cover;object-position:left;\"\/><\/a><\/div><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0442\u0435\u043a:<\/p>\n<ul>\n<li>\n<p><code>backend<\/code> &#8212; Go-\u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a \u0432 Alpine-\u043e\u0431\u0440\u0430\u0437\u0435, \u0431\u0435\u0437 root, <code>uid 1000<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>frontend<\/code> &#8212; nginx \u043d\u0430 <code>stable-alpine<\/code>, \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c <code>USER 101<\/code>;<\/p>\n<\/li>\n<li>\n<p><code>postgres:16<\/code> &#8212; \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445;<\/p>\n<\/li>\n<li>\n<p><code>redis:7<\/code> &#8212; \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0438 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0435 \u0444\u043e\u043d\u043e\u0432\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438.<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u043b\u044f production-\u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f \u0435\u0441\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0444\u0438\u043b\u044c <a href=\"http:\/\/docker-compose.prod\" rel=\"noopener noreferrer nofollow\"><code>docker-compose.prod<\/code><\/a><code>.yml<\/code>: \u043b\u0438\u043c\u0438\u0442\u044b \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432, healthcheck-\u0438, JSON-\u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0431\u043e\u043b\u0435\u0435 \u0441\u0442\u0440\u043e\u0433\u0438\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432.<\/p>\n<p>TLS\/HTTPS \u044f \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u043e \u0432\u044b\u043d\u0435\u0441 \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041e\u0431\u044b\u0447\u043d\u043e \u0432 \u0442\u0430\u043a\u043e\u0439 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u043f\u0435\u0440\u0435\u0434 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e\u0439 \u0443\u0436\u0435 \u0441\u0442\u043e\u0438\u0442 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 <code>nginx<\/code>, reverse proxy \u0438\u043b\u0438 \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u0432\u0435\u0447\u0430\u0435\u0442 \u0437\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b, \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u044e \u0438 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u043f\u0435\u0440\u0438\u043c\u0435\u0442\u0440 (\u043d\u043e \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u043f\u043e\u043f\u044b\u0442\u0430\u044e\u0441\u044c \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c).<\/p>\n<h3>\u0427\u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435<\/h3>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 <code>0.1.0b<\/code> &#8212; \u044d\u0442\u043e \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u0431\u0435\u0442\u0430-\u0440\u0435\u043b\u0438\u0437. \u041d\u0430 \u0432\u0435\u0440\u0441\u0438\u044e <code>0.2.0<\/code> \u044f \u043f\u043e\u043a\u0430 \u0437\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u044e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0439:<\/p>\n<ul>\n<li>\n<p><strong>\u0418\u043c\u043f\u043e\u0440\u0442 SBOM<\/strong> &#8212; \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 CycloneDX \u0438 SPDX \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u043e\u0433\u0430\u0449\u0435\u043d\u0438\u0435\u043c \u0447\u0435\u0440\u0435\u0437 \u0411\u0414\u0423 \u0424\u0421\u0422\u042d\u041a \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0438\u043a\u0438.<\/p>\n<\/li>\n<li>\n<p><strong>\u041d\u043e\u0432\u044b\u0435 \u043f\u0430\u0440\u0441\u0435\u0440\u044b<\/strong> &#8212; \u0441\u043f\u0438\u0441\u043e\u043a \u0435\u0449\u0451 \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f. \u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c, \u0431\u0443\u0434\u0443 \u0440\u0430\u0434 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 \u0435\u0433\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0430.<\/p>\n<\/li>\n<li>\n<p><strong>Auto-resolution<\/strong> &#8212; \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u043d\u0430\u0445\u043e\u0434\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432 \u043d\u043e\u0432\u044b\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u0445 \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<\/li>\n<\/ul>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u0431\u0443\u0434\u0443 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043f\u043e \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0439 \u0441\u0432\u044f\u0437\u0438 \u0438 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u043c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u044f\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f. \u041d\u0430 \u044d\u0442\u0430\u043f\u0435 <code>0.1.0b<\/code> \u043b\u0435\u0433\u043a\u043e \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u043e\u0439 roadmap \u043d\u0430 \u0433\u043e\u0434 \u0432\u043f\u0435\u0440\u0451\u0434, \u043d\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u0432\u0430\u0436\u043d\u0435\u0435 \u0434\u0440\u0443\u0433\u043e\u0435: \u0441\u0442\u0430\u0431\u0438\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438, \u0437\u0430\u043a\u0440\u044b\u0442\u044c \u043e\u0431\u0435\u0449\u0430\u043d\u043d\u043e\u0435 \u0432 <code>0.2.0<\/code> \u0438 \u043d\u0435 \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u0438\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442 \u0432 \u043d\u0430\u0431\u043e\u0440 \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0445, \u043d\u043e \u043d\u0435\u0434\u043e\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u0445 \u0438\u0434\u0435\u0439.<\/p>\n<h3>\u0412\u044b\u0432\u043e\u0434\u044b<\/h3>\n<p>\u0413\u043e\u0434 \u043d\u0430\u0437\u0430\u0434 \u0438\u0434\u0435\u044f \u043f\u0438\u0441\u0430\u0442\u044c ASOC \u0441 \u043d\u0443\u043b\u044f \u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u043c\u043d\u0435 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0431\u0435\u0437\u0443\u043c\u043d\u043e\u0439. \u0421\u0435\u0439\u0447\u0430\u0441 \u044f \u0434\u0443\u043c\u0430\u044e \u0438\u043d\u0430\u0447\u0435: \u0438\u043d\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0449\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043f\u043e\u0434 \u0441\u0432\u043e\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0438 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442, \u0447\u0435\u043c \u0434\u043e\u043b\u0433\u043e \u043f\u043e\u0434\u0433\u043e\u043d\u044f\u0442\u044c \u0447\u0443\u0436\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u043e\u0434 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438, \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043e\u043d\u043e \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043d\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u043e\u0441\u044c.<\/p>\n<p>\u0412 \u0438\u0442\u043e\u0433\u0435 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0430\u0441\u044c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u044f\u043c\u043e\u043b\u0438\u043d\u0435\u0439\u043d\u043e\u0439:<\/p>\n<ul>\n<li>\n<p>\u043f\u0430\u0440\u0441\u0435\u0440\u044b &#8212; \u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442 <code>CanParse<\/code> + <code>Parse<\/code>;<\/p>\n<\/li>\n<li>\n<p>\u0434\u0435\u0434\u0443\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u044f &#8212; \u043e\u0434\u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f <code>CalculateFingerprint<\/code>;<\/p>\n<\/li>\n<li>\n<p>\u043e\u0431\u043e\u0433\u0430\u0449\u0435\u043d\u0438\u0435 &#8212; \u0444\u043e\u043d\u043e\u0432\u044b\u0435 \u0432\u043e\u0440\u043a\u0435\u0440\u044b \u043d\u0430 Redis Streams;<\/p>\n<\/li>\n<li>\n<p>\u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0438\u0437\u0430\u0446\u0438\u044f &#8212; \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0444\u043e\u0440\u043c\u0443\u043b\u0430 \u0438 \u0433\u043e\u0442\u043e\u0432\u0430\u044f \u0432\u0438\u0442\u0440\u0438\u043d\u0430 \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430;<\/p>\n<\/li>\n<li>\n<p>API &#8212; \u043a\u0443\u0440\u0441\u043e\u0440\u043d\u0430\u044f \u043f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u044f \u043d\u0430 \u0432\u0441\u0435\u0445 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0441\u043f\u0438\u0441\u043a\u0430\u0445.<\/p>\n<\/li>\n<\/ul>\n<p>\u0413\u043b\u0430\u0432\u043d\u044b\u0435 \u0443\u0440\u043e\u043a\u0438:<\/p>\n<ol>\n<li>\n<p><strong>\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u0441 \u0441\u0430\u043c\u043e\u0433\u043e \u043d\u0430\u0447\u0430\u043b\u0430.<\/strong><br \/> \u041a\u0443\u0440\u0441\u043e\u0440\u043d\u0430\u044f \u043f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u044f, \u0446\u0435\u043b\u0435\u0432\u044b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0438 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0432\u0438\u0442\u0440\u0438\u043d\u044b \u0434\u043b\u044f \u0442\u044f\u0436\u0451\u043b\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u0438\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0449\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0440\u0430\u0437\u0443, \u0447\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u0433\u043e\u0434, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0443\u0436\u0435 \u0437\u0430\u0432\u044f\u0437\u0430\u043d\u0430 \u043d\u0430 \u0441\u0442\u0430\u0440\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c.<\/p>\n<\/li>\n<li>\n<p><strong>\u041c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0442\u0435\u043a \u0447\u0430\u0441\u0442\u043e \u0432\u044b\u0438\u0433\u0440\u044b\u0432\u0430\u0435\u0442.<\/strong><br \/> Redis Streams \u0432\u043c\u0435\u0441\u0442\u043e Kafka, <code>pgx<\/code> \u0432\u043c\u0435\u0441\u0442\u043e ORM, Docker Compose \u0432\u043c\u0435\u0441\u0442\u043e \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e Kubernetes. \u041c\u0435\u043d\u044c\u0448\u0435 \u0434\u0432\u0438\u0436\u0443\u0449\u0438\u0445\u0441\u044f \u0447\u0430\u0441\u0442\u0435\u0439 &#8212; \u043f\u0440\u043e\u0449\u0435 \u043e\u0442\u043b\u0430\u0434\u043a\u0430, \u0440\u0430\u0437\u0432\u0451\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0438 \u0441\u043e\u043f\u0440\u043e\u0432\u043e\u0436\u0434\u0435\u043d\u0438\u0435.<\/p>\n<\/li>\n<li>\n<p><strong>\u0421\u043a\u0443\u0447\u043d\u044b\u0435 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u043e\u0431\u044b\u0447\u043d\u043e \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043b\u0443\u0447\u0448\u0438\u043c\u0438.<\/strong><br \/> Go, PostgreSQL, Redis, React &#8212; \u0431\u0435\u0437 \u044d\u043a\u0437\u043e\u0442\u0438\u043a\u0438 \u0438 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u043e\u0433\u043e \u0446\u0438\u0440\u043a\u0430. \u0422\u0430\u043a\u043e\u0439 \u0441\u0442\u0435\u043a \u043f\u0440\u043e\u0449\u0435 \u043f\u043e\u043d\u044f\u0442\u044c, \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c \u0438 \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0442\u044c \u043d\u043e\u0432\u044b\u043c \u043b\u044e\u0434\u044f\u043c.<\/p>\n<\/li>\n<li>\n<p><strong>\u0411\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c \u0441\u0430\u043c\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b \u043d\u0435 \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u0430.<\/strong><br \/> ASOC \u0445\u0440\u0430\u043d\u0438\u0442 \u0447\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u0443\u0447\u0430\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 security-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f, RBAC, \u0430\u0443\u0434\u0438\u0442, rate limit \u0438 \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0441\u0435\u043a\u0440\u0435\u0442\u0430\u043c\u0438 &#8212; \u044d\u0442\u043e \u043d\u0435 \u201c\u043f\u043e\u0442\u043e\u043c\u201d, \u0430 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043c\u0438\u043d\u0438\u043c\u0443\u043c.<\/p>\n<\/li>\n<\/ol>\n<p>\u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u043e\u043f\u044b\u0442 \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438, \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0438\u0442\u0435 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445, \u0447\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 \u0438 \u0447\u0442\u043e \u0432 \u044d\u0442\u043e\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u0440\u0430\u0437\u0434\u0440\u0430\u0436\u0430\u0435\u0442. \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e: \u0438\u043c\u043f\u043e\u0440\u0442 \u043e\u0442\u0447\u0451\u0442\u043e\u0432, \u0434\u0443\u0431\u043b\u0438, \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0438\u0437\u0430\u0446\u0438\u044f, \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0441 CI\/CD \u0438\u043b\u0438 \u0440\u0430\u0431\u043e\u0442\u0430 \u0432 \u0437\u0430\u043a\u0440\u044b\u0442\u043e\u043c \u043a\u043e\u043d\u0442\u0443\u0440\u0435.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u043e\u0434\u043d\u044f\u0442\u044c Red Lycoris \u0443 \u0441\u0435\u0431\u044f \u0438 \u043f\u043e\u0442\u044b\u043a\u0430\u0442\u044c &#8212; \u0431\u0443\u0434\u0443 \u0440\u0430\u0434 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0439 \u0441\u0432\u044f\u0437\u0438. \u0414\u043b\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043d\u0430 \u0441\u0442\u0430\u0434\u0438\u0438 <code>0.1.0b<\/code> \u044d\u0442\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u0441\u0430\u043c\u044b\u0439 \u0446\u0435\u043d\u043d\u044b\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f.<\/p>\n<p>\u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439: <a href=\"https:\/\/github.com\/nefrit0n\/red-lycoris\" rel=\"noopener noreferrer nofollow\">github.com\/nefrit0n\/red-lycoris<\/a><br \/>\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u044f: Apache 2.0.<\/p>\n<\/div>\n<p>\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/1033530\/\">https:\/\/habr.com\/ru\/articles\/1033530\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u041a\u043e\u0433\u0434\u0430 \u044f \u043d\u0430\u0447\u0430\u043b \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f, \u0447\u0435\u043c \u0432 \u043c\u0438\u0440\u0435 \u043e\u043f\u0435\u043d\u0441\u043e\u0440\u0441\u0430 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043a\u0440\u044b\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 ASOC \/ Vulnerability Management, \u0432\u044b\u0431\u043e\u0440 \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u0433\u0440\u0443\u0441\u0442\u043d\u044b\u043c. \u041f\u043e \u0441\u0443\u0442\u0438 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u044d\u0442\u043e DefectDojo. \u0421\u0430\u043c \u044f \u0435\u0433\u043e \u0432 \u043f\u0440\u043e\u0434\u0435 \u043d\u0435 \u0442\u0430\u0449\u0438\u043b, \u043d\u043e \u043e\u0442 \u043a\u043e\u043b\u043b\u0435\u0433 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e \u0441\u043b\u044b\u0448\u0430\u043b \u043e\u0434\u043d\u0443 \u0438 \u0442\u0443 \u0436\u0435 \u0431\u043e\u043b\u044c: \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u043e\u0431\u044a\u0451\u043c\u0430\u0445 \u043e\u043d \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0437\u0430\u0445\u043b\u0451\u0431\u044b\u0432\u0430\u0442\u044c\u0441\u044f, \u0438 \u0442\u0435\u0431\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0437\u0430\u0445\u043e\u0434\u0438\u0442\u044c, \u0430 \u0430\u043d\u0430\u043b\u043e\u0433\u043e\u0432 \u0441 \u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u043a\u0438\u043c \u0432\u0438\u0434\u043e\u043c \u0438 \u0411\u0414\u0423 \u0424\u0421\u0422\u042d\u041a \u00ab\u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438\u00bb \u0432 \u043e\u043f\u0435\u043d\u0441\u043e\u0440\u0441\u0435 \u044f \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u043d\u0430\u0448\u0451\u043b. \u0422\u0430\u043a \u0438 \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u043c\u043e\u044f ASOC-\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430: Go + PostgreSQL + Redis Streams + React, \u0440\u0430\u0437\u0432\u0451\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 docker compose up, \u043c\u0438\u043b\u043b\u0438\u043e\u043d \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0431\u0435\u0437 \u0442\u043e\u0440\u043c\u043e\u0437\u043e\u0432 (\u043f\u043e\u0447\u0442\u0438), \u043e\u0431\u043e\u0433\u0430\u0449\u0435\u043d\u0438\u0435 \u0438\u0437 7 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432, \u0444\u043e\u0440\u043c\u0443\u043b\u0430 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0438\u0437\u0430\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e CVSS, \u043d\u043e \u0435\u0449\u0451 EPSS, CISA KEV \u0438 \u0411\u0414\u0423 \u0424\u0421\u0422\u042d\u041a. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043f\u0440\u043e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u0433\u0440\u0430\u0431\u043b\u0438 \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u044f \u0432\u044b\u043a\u0438\u043d\u0443\u043b ORM \u0435\u0449\u0451 \u0434\u043e \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u0447\u043a\u0438 SQL.\u042d\u0442\u043e \u043d\u0435 \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u0440\u043e \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0440\u043e\u0434\u0443\u043a\u0442 \u0438 \u043d\u0435 \u043f\u0438\u0430\u0440-\u0440\u0435\u043b\u0438\u0437. \u0421\u043a\u043e\u0440\u0435\u0435 \u0440\u0430\u0437\u0431\u043e\u0440 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b\u043b \u0441\u043f\u0440\u043e\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d Red Lycoris, \u043e\u043f\u0435\u043d\u0441\u043e\u0440\u0441-\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u0434\u043b\u044f \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f, \u0434\u0435\u0434\u0443\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438, \u043e\u0431\u043e\u0433\u0430\u0449\u0435\u043d\u0438\u044f \u0438 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0435\u0439. \u042f \u0434\u0435\u043b\u0430\u044e \u0435\u0451 \u043e\u0434\u0438\u043d, \u0438 \u0435\u0441\u043b\u0438 \u043a\u043e\u043c\u0443-\u0442\u043e \u043e\u043d\u0430 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f, \u0431\u0443\u0434\u0443 \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0434. \u0415\u0441\u043b\u0438 \u043d\u0430\u0439\u0434\u0451\u0442\u0435, \u0433\u0434\u0435 \u044f \u043e\u0448\u0438\u0431\u0441\u044f \u0432 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435, \u0431\u0443\u0434\u0443 \u0440\u0430\u0434 \u0432\u0434\u0432\u043e\u0439\u043d\u0435.\u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0434\u0430\u0448\u0431\u043e\u0440\u0434\u043e\u0432\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 ASOC \u0438 \u0437\u0430\u0447\u0435\u043c \u043e\u043d \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0443\u0436\u0435\u043dASOC (Application Security Orchestration and Correlation) &#8212; \u044d\u0442\u043e \u0441\u043b\u043e\u0439 \u043c\u0435\u0436\u0434\u0443 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0438 \u043b\u044e\u0434\u044c\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043f\u043e \u0438\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c: AppSec-\u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c\u0438, \u0442\u0438\u043c\u043b\u0438\u0434\u0430\u043c\u0438 \u0438 \u0438\u043d\u043e\u0433\u0434\u0430 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0430\u043c\u0438 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0430.\u0415\u0441\u043b\u0438 \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c, ASOC \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0438\u0437 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u043a\u0430\u043d\u0435\u0440\u043e\u0432 \u0432 \u043e\u0434\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435, \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u0438\u0445 \u043a \u0435\u0434\u0438\u043d\u043e\u043c\u0443 \u0432\u0438\u0434\u0443, \u0443\u0431\u0440\u0430\u0442\u044c \u0434\u0443\u0431\u043b\u0438, \u0441\u0432\u044f\u0437\u0430\u0442\u044c \u043d\u0430\u0445\u043e\u0434\u043a\u0438 \u0441 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u043c\u0438 \u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f.\u041a\u043e\u0433\u0434\u0430 AppSec-\u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442 \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u0442\u044c\u0441\u044f, \u043e\u0431\u044b\u0447\u043d\u043e \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435 \u043e\u0434\u0438\u043d \u0443\u043d\u0438\u0432\u0435\u0440\u0441\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043a\u0430\u043d\u0435\u0440, \u0430 \u043d\u0430\u0431\u043e\u0440 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u043e\u0434 \u0440\u0430\u0437\u043d\u044b\u0435 \u0442\u0438\u043f\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a. \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0441\u0442\u0435\u043a \u0443 \u0432\u0441\u0435\u0445 \u0440\u0430\u0437\u043d\u044b\u0439: \u0433\u0434\u0435-\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 open-source, \u0433\u0434\u0435-\u0442\u043e \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f, \u0433\u0434\u0435-\u0442\u043e \u0432\u0441\u0451 \u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u043d\u0430 \u0441\u043a\u0440\u0438\u043f\u0442\u0430\u0445 \u0432 CI. \u041d\u043e \u0441\u0430\u043c\u0438 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u0447\u0430\u0441\u0442\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0442\u0441\u044f:SAST &#8212; \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0430\u043d\u0430\u043b\u0438\u0437 \u043a\u043e\u0434\u0430: Semgrep, OpenGrep, SonarQube, CodeQL \u0438\u043b\u0438 \u0430\u043d\u0430\u043b\u043e\u0433\u0438.SCA &#8212; \u0430\u043d\u0430\u043b\u0438\u0437 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0438 open-source \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432: Trivy, Grype, Snyk, Mend \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f.DAST &#8212; \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439: OWASP ZAP, Burp Suite, Acunetix \u0438\u043b\u0438 \u043f\u043e\u0445\u043e\u0436\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b.IaC &#8212; \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0439: Checkov, tfsec, Trivy config \u0438 \u0430\u043d\u0430\u043b\u043e\u0433\u0438.Secrets &#8212; \u043f\u043e\u0438\u0441\u043a \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432, \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u0438 \u043a\u043b\u044e\u0447\u0435\u0439: TruffleHog, Gitleaks \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0441\u043a\u0430\u043d\u0435\u0440\u044b.\u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b &#8212; \u0430\u043d\u0430\u043b\u0438\u0437 \u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u0438 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0432\u043d\u0443\u0442\u0440\u0438 \u043d\u0438\u0445: Trivy image, Grype \u0438 \u043f\u043e\u0445\u043e\u0436\u0438\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f.\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u043d\u0435 \u0438\u0437-\u0437\u0430 \u0441\u0430\u043c\u0438\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432. \u041a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043d\u0438\u0445 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u0435\u043d \u0432 \u0441\u0432\u043e\u0435\u0439 \u0437\u043e\u043d\u0435. \u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043e\u043d\u0438 \u0433\u043e\u0432\u043e\u0440\u044f\u0442 \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445: \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u0432\u043e\u0439 \u0444\u043e\u0440\u043c\u0430\u0442 \u043e\u0442\u0447\u0451\u0442\u0430, \u0441\u0432\u043e\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u043e\u0441\u0442\u0438, \u0441\u0432\u043e\u0451 \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u043e\u0432 \u0438 \u0441\u0432\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u0443 \u0438 \u0442\u0443 \u0436\u0435 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u044c.\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 CVE-2021-44228 \u043c\u043e\u0436\u0435\u0442 \u0432\u0441\u043f\u043b\u044b\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043c\u0435\u0441\u0442\u0430\u0445: SCA-\u0441\u043a\u0430\u043d\u0435\u0440 \u043d\u0430\u0439\u0434\u0451\u0442 \u0435\u0433\u043e \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u0445, \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043d\u044b\u0439 \u0441\u043a\u0430\u043d\u0435\u0440 \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u0440\u0430\u0437\u0430, \u0434\u0440\u0443\u0433\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0432 lockfile \u0438\u043b\u0438 SBOM. \u0424\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u044d\u0442\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043f\u0438\u0441\u0435\u0439, \u043d\u043e \u043f\u043e \u0441\u043c\u044b\u0441\u043b\u0443 \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u044c\u0441\u044f \u043a \u043e\u0434\u043d\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0435 \u0432 \u043e\u0434\u043d\u043e\u043c \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0435.\u0422\u0435\u043f\u0435\u0440\u044c \u0443\u043c\u043d\u043e\u0436\u044c\u0442\u0435 \u044d\u0442\u043e \u043d\u0430 \u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043c\u0430\u043d\u0434, \u0440\u0430\u0437\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0438 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0438 \u0432 CI. \u041d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043d\u0435 \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0437\u0430\u0434\u0430\u0447, \u0430 \u043f\u043e\u0442\u043e\u043a \u043d\u0430\u0445\u043e\u0434\u043e\u043a, \u0433\u0434\u0435 \u0447\u0430\u0441\u0442\u044c \u0434\u0443\u0431\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u0447\u0430\u0441\u0442\u044c \u0443\u0441\u0442\u0430\u0440\u0435\u043b\u0430, \u0447\u0430\u0441\u0442\u044c \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u043b\u0438\u044f\u043d\u0438\u044f, \u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u0430\u0436\u043d\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043b\u0435\u0433\u043a\u043e \u0442\u0435\u0440\u044f\u044e\u0442\u0441\u044f \u0432 \u0448\u0443\u043c\u0435.\u0412\u043e\u0442 \u0437\u0434\u0435\u0441\u044c \u0438 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043c\u044b\u0441\u043b ASOC: \u043d\u0435 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u043a\u0430\u043d\u0435\u0440\u044b, \u0430 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0438\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b, \u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435, \u0441\u0432\u044f\u0437\u0430\u0442\u044c \u043d\u0430\u0445\u043e\u0434\u043a\u0438 \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439 \u0438 \u043f\u043e\u043c\u043e\u0447\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u0435 \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u0447\u0438\u043d\u0438\u0442\u044c \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c.ASOC \u043d\u0443\u0436\u0435\u043d \u043d\u0435 \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u043a\u0430\u043d\u0435\u0440\u044b, \u0430 \u0447\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0445 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043f\u0440\u0438\u0433\u043e\u0434\u043d\u044b\u043c\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b.\u041e\u0431\u044b\u0447\u043d\u043e \u043e\u043d \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0434\u0430\u0447:\u0418\u043c\u043f\u043e\u0440\u0442 \u0438 \u043f\u0430\u0440\u0441\u0438\u043d\u0433 &#8212; \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043e\u0442\u0447\u0451\u0442\u044b \u043e\u0442 \u0440\u0430\u0437\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442 \u0438\u0445 \u043a \u0435\u0434\u0438\u043d\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0445.\u041d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f &#8212; \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u0435\u0439, severity, \u0441\u0442\u0430\u0442\u0443\u0441\u044b, \u0442\u0438\u043f\u044b \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0438 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435.\u0414\u0435\u0434\u0443\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u044f &#8212; \u0441\u043a\u043b\u0435\u0438\u0432\u0430\u0435\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0435\u0441\u044f \u043d\u0430\u0445\u043e\u0434\u043a\u0438, \u0447\u0442\u043e\u0431\u044b \u043e\u0434\u043d\u0430 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u043d\u0435 \u0432\u0438\u0441\u0435\u043b\u0430 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0442\u0440\u0435\u043c\u044f \u0440\u0430\u0437\u043d\u044b\u043c\u0438 critical-\u0437\u0430\u043f\u0438\u0441\u044f\u043c\u0438.\u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0438\u0437\u0430\u0446\u0438\u044f &#8212; \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u0447\u0438\u043d\u0438\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u043c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u201c50 critical \u043e\u0442 \u0441\u043a\u0430\u043d\u0435\u0440\u0430\u201d \u0438 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u044d\u0442\u043e \u0440\u0430\u0437\u043d\u044b\u0435 \u0432\u0441\u0435\u043b\u0435\u043d\u043d\u044b\u0435.API \u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 &#8212; \u0434\u0430\u0451\u0442 CI\/CD \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b, \u0430 AppSec \u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u043a\u0440\u0430\u043d \u0434\u043b\u044f \u0440\u0430\u0437\u0431\u043e\u0440\u0430, \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438 \u0438 \u043f\u0440\u0438\u043d\u044f\u0442\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u0439.\u0412\u0430\u0436\u043d\u043e \u043d\u0435 \u043f\u0443\u0442\u0430\u0442\u044c ASOC \u0441\u043e \u0441\u043a\u0430\u043d\u0435\u0440\u043e\u043c, SIEM \u0438\u043b\u0438 ASM\/ASMP.ASOC \u0441\u0430\u043c \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0441\u043a\u0430\u043d\u0438\u0440\u0443\u0435\u0442. \u041e\u043d \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043e\u0442 \u0434\u0440\u0443\u0433\u0438\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0438 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0441 \u043d\u0438\u043c\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c.SIEM \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0440\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438, \u043b\u043e\u0433\u0438 \u0438 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433.ASM\/ASMP &#8212; \u043f\u0440\u043e \u0432\u043d\u0435\u0448\u043d\u044e\u044e \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u044c \u0430\u0442\u0430\u043a\u0438: \u0434\u043e\u043c\u0435\u043d\u044b, IP, \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0438 \u044d\u043a\u0441\u043f\u043e\u0437\u0438\u0446\u0438\u044e \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0435.ASOC &#8212; \u043f\u0440\u043e AppSec-\u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u043d\u0443\u0442\u0440\u0438 SDLC: \u043a\u043e\u0434, \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b, IaC, \u0441\u0435\u043a\u0440\u0435\u0442\u044b \u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u0432 CI\/CD.\u041f\u043e\u0447\u0435\u043c\u0443 \u044f \u043d\u0435 \u043e\u0441\u0442\u0430\u043b\u0441\u044f \u043d\u0430 DefectDojoDefectDojo &#8212; \u0441\u0430\u043c\u044b\u0439 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439 open-source ASOC. \u041d\u043e \u043f\u043e\u0441\u043b\u0435 \u043e\u0442\u0437\u044b\u0432\u043e\u0432 \u043a\u043e\u043b\u043b\u0435\u0433 \u0438 \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u043e\u0433\u043e \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f \u044f \u043f\u043e\u043d\u044f\u043b, \u0447\u0442\u043e \u0434\u043b\u044f \u043c\u043e\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u043e\u043d \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u043d\u0435 \u0442\u0430\u043a \u0445\u043e\u0440\u043e\u0448\u043e.\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c. \u041d\u0430 \u043e\u0431\u044a\u0451\u043c\u0430\u0445 \u043e\u043a\u043e\u043b\u043e ~100k \u043d\u0430\u0445\u043e\u0434\u043e\u043a \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0443\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u0441\u044f \u0442\u044f\u0436\u0451\u043b\u044b\u043c: \u0444\u0438\u043b\u044c\u0442\u0440\u044b \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0434\u043e\u043b\u0433\u043e, \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0435 \u0442\u0430\u043a \u043e\u0442\u0437\u044b\u0432\u0447\u0438\u0432\u043e, \u043a\u0430\u043a \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b. \u041d\u0430 1M+ \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0431\u0435\u0437 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0436\u0438\u0442\u044c \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0441\u043b\u043e\u0436\u043d\u043e. \u041a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0438\u0439 Django + ORM + \u043f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u044f \u0447\u0435\u0440\u0435\u0437 OFFSET \u0434\u0430\u044e\u0442 \u043e \u0441\u0435\u0431\u0435 \u0437\u043d\u0430\u0442\u044c, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0448\u044c \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043f\u043b\u0430\u043d\u044b \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0445.\u041d\u0435\u0442 \u0411\u0414\u0423 \u0424\u0421\u0422\u042d\u041a \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438. \u0414\u043b\u044f \u0440\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u0438\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u044d\u0442\u043e \u0432\u0430\u0436\u043d\u044b\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0434\u0430\u043d\u043d\u044b\u0445: \u0433\u0434\u0435-\u0442\u043e \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u044b\u0439, \u0433\u0434\u0435-\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u044b\u0439. \u0412 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u043c \u043d\u0430\u0431\u043e\u0440\u0435 \u0447\u0430\u0449\u0435 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f NVD, EPSS, \u0438\u043d\u043e\u0433\u0434\u0430 KEV. \u0411\u0414\u0423 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0430\u043c\u043e\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e, \u043d\u043e \u044d\u0442\u043e \u0443\u0436\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u0430\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430, \u0430 \u043d\u0435 \u0433\u043e\u0442\u043e\u0432\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b.\u0423\u0441\u0442\u0430\u0440\u0435\u0432\u0448\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441. Bootstrap 3 \u0438 Django-\u0448\u0430\u0431\u043b\u043e\u043d\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442, \u043d\u043e \u0432 2026 \u0433\u043e\u0434\u0443 \u043e\u0442 ASOC \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f UX: \u0431\u044b\u0441\u0442\u0440\u044b\u0445 \u0442\u0430\u0431\u043b\u0438\u0446 \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u043e\u0431\u044a\u0451\u043c\u044b, \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0444\u0430\u0441\u0435\u0442\u043d\u043e\u0439 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438, \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u0432 URL \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043b\u043b\u0435\u0433\u0435 \u0441\u0441\u044b\u043b\u043a\u0443 \u0443\u0436\u0435 \u0441 \u043d\u0443\u0436\u043d\u044b\u043c\u0438 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u043c\u0438.\u0420\u0430\u0431\u043e\u0442\u0430 \u0432 \u0437\u0430\u043a\u0440\u044b\u0442\u043e\u043c \u043a\u043e\u043d\u0442\u0443\u0440\u0435. \u0414\u043b\u044f \u0431\u0430\u043d\u043a\u043e\u0432, \u0433\u043e\u0441\u0430 \u0438 \u0442\u0435\u043b\u0435\u043a\u043e\u043c\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430 &#8212; \u043d\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u0430 \u043e\u0431\u044b\u0447\u043d\u043e\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0435. DefectDojo \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043e\u0444\u043b\u0430\u0439\u043d, \u043d\u043e \u0431\u0435\u0437 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432 \u043e\u0431\u043e\u0433\u0430\u0449\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u043c. \u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0441\u043a\u043e\u0440\u0435\u0435 \u0432 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u043d\u0430\u0445\u043e\u0434\u043e\u043a, \u0447\u0435\u043c \u0432 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0438\u0437\u0430\u0446\u0438\u0438.\u042f \u043d\u0435 \u0430\u0433\u0438\u0442\u0438\u0440\u0443\u044e \u043f\u0440\u043e\u0442\u0438\u0432 DefectDojo. \u0414\u043b\u044f \u043c\u043d\u043e\u0433\u0438\u0445 \u043a\u043e\u043c\u0430\u043d\u0434 \u044d\u0442\u043e \u0432\u0441\u0451 \u0435\u0449\u0451 \u0431\u043e\u043b\u0435\u0435 \u0437\u0440\u0435\u043b\u044b\u0439 \u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439 \u0432\u044b\u0431\u043e\u0440, \u0447\u0435\u043c \u043c\u043e\u0439 ASOC, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u043d\u0430 \u0443\u043c\u0435\u0440\u0435\u043d\u043d\u044b\u0445 \u043e\u0431\u044a\u0451\u043c\u0430\u0445. \u041f\u0440\u043e\u0441\u0442\u043e \u043c\u043d\u0435 \u043d\u0443\u0436\u0435\u043d \u0431\u044b\u043b \u0434\u0440\u0443\u0433\u043e\u0439 \u0444\u043e\u043a\u0443\u0441: \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0440\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u0438\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442, \u0437\u0430\u043a\u0440\u044b\u0442\u044b\u0439 \u043a\u043e\u043d\u0442\u0443\u0440 \u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u0440\u0430\u0437\u0431\u043e\u0440 \u043d\u0430\u0445\u043e\u0434\u043e\u043a.\u0427\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u044f\u041d\u0430 \u0441\u0442\u0430\u0440\u0442\u0435 \u044f \u0441\u0444\u043e\u0440\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u043b \u0434\u043b\u044f \u0441\u0435\u0431\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439:\u0422\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0435\u0417\u0430\u0447\u0435\u043c\u0420\u0430\u0437\u0432\u0451\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0443 \u0441\u0435\u0431\u044f, \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0431\u0435\u0437 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430\u0426\u0435\u043b\u0435\u0432\u0430\u044f \u0430\u0443\u0434\u0438\u0442\u043e\u0440\u0438\u044f &#8212; \u0431\u0430\u043d\u043a\u0438, \u0433\u043e\u0441\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0438 \u0442\u0435\u043b\u0435\u043a\u043e\u043c. \u0414\u043b\u044f \u0442\u0430\u043a\u0438\u0445 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0439 \u043e\u0431\u043b\u0430\u0447\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0447\u0430\u0441\u0442\u043e \u043d\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043f\u043e \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f\u043c \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0438 compliance.\u0411\u0414\u0423 \u0424\u0421\u0422\u042d\u041a \u043a\u0430\u043a \u043f\u0435\u0440\u0432\u043e\u043a\u043b\u0430\u0441\u0441\u043d\u044b\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0414\u043b\u044f \u0440\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u0438\u0445 \u043a\u043e\u043c\u0430\u043d\u0434 \u044d\u0442\u043e \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u201c\u0435\u0449\u0451 \u043e\u0434\u043d\u0430 \u0431\u0430\u0437\u0430\u201d, \u0430 \u0432\u0430\u0436\u043d\u044b\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0434\u043b\u044f \u0441\u0432\u0435\u0440\u043a\u0438, \u043e\u0431\u043e\u0433\u0430\u0449\u0435\u043d\u0438\u044f \u0438 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0443\u044f\u0437\u0432\u0438\u043c\u043e\u0441\u0442\u0435\u0439.1M+ \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0431\u0435\u0437 \u0442\u043e\u0440\u043c\u043e\u0437\u043e\u0432\u0414\u0430\u0436\u0435 \u043d\u0435 \u0441\u0430\u043c\u0430\u044f \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u044f \u0437\u0430 \u043f\u0430\u0440\u0443 \u043b\u0435\u0442 \u043c\u043e\u0436\u0435\u0442 \u043d\u0430\u043a\u043e\u043f\u0438\u0442\u044c \u0441\u043e\u0442\u043d\u0438 \u0442\u044b\u0441\u044f\u0447 \u043d\u0430\u0445\u043e\u0434\u043e\u043a, \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0435\u0441\u043b\u0438 \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043e \u0432 CI\/CD.\u041e\u0434\u0438\u043d \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a + Postgres + Redis\u0411\u0435\u0437 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e Kubernetes \u0438 \u0441\u043b\u043e\u0436\u043d\u043e\u0439 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b. \u041f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u043a\u0435.\u041f\u043e\u043d\u044f\u0442\u043d\u044b\u0439 REST API + OpenAPI\u041d\u0430\u0445\u043e\u0434\u043a\u0438 \u0447\u0430\u0449\u0435 \u043f\u0440\u0438\u0435\u0437\u0436\u0430\u044e\u0442 \u0438\u0437 CI\/CD, \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438, \u0430 \u043d\u0435 \u0447\u0435\u0440\u0435\u0437 \u0440\u0443\u0447\u043d\u0443\u044e \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435. \u0425\u043e\u0442\u044f \u0440\u0443\u0447\u043d\u043e\u0439 \u0438\u043c\u043f\u043e\u0440\u0442 \u0442\u043e\u0436\u0435 \u043d\u0443\u0436\u0435\u043d.\u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441ASOC \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u043a\u0430\u043a \u0430\u0434\u043c\u0438\u043d\u043a\u0430 \u0438\u0437 2012 \u0433\u043e\u0434\u0430. \u041d\u0443\u0436\u0435\u043d \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0439, \u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u0438 \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u044b\u0439 UI \u0431\u0435\u0437 \u0432\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0433\u0440\u0443\u0437\u0430.\u0420\u0443\u0441\u0441\u043a\u0438\u0439 \u044f\u0437\u044b\u043a \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e\u0426\u0435\u043b\u0435\u0432\u0430\u044f \u0430\u0443\u0434\u0438\u0442\u043e\u0440\u0438\u044f &#8212; \u0440\u043e\u0441\u0441\u0438\u0439\u0441\u043a\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u0441\u0442\u0430\u0442\u0443\u0441\u044b \u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u043f\u043e\u043d\u044f\u0442\u043d\u044b \u0431\u0435\u0437 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430.\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 Red Lycoris \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u0431\u0435\u0437 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0431\u0440\u0435\u043d\u0434-\u0441\u0442\u0440\u0430\u0442\u0435\u0433\u0438\u0438. \u042f \u043f\u0440\u043e\u0441\u0442\u043e \u0447\u0430\u0441\u0442\u043e \u0432\u0438\u0434\u0435\u043b \u044d\u0442\u043e\u0442 \u0446\u0432\u0435\u0442\u043e\u043a \u0432 \u0430\u043d\u0438\u043c\u0435.\u0421\u0442\u0435\u043a \u0438 \u043f\u043e\u0447\u0435\u043c\u0443 \u0438\u043c\u0435\u043d\u043d\u043e \u0442\u0430\u043a\u043e\u0439\u0421\u0442\u0435\u043a \u044f \u0432\u044b\u0431\u0438\u0440\u0430\u043b \u043d\u0435 \u043f\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443 \u201c\u0447\u0442\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u043c\u043e\u0434\u043d\u043e\u201d, \u0430 \u043f\u043e\u0434 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f: \u0437\u0430\u043a\u0440\u044b\u0442\u044b\u0439 \u043a\u043e\u043d\u0442\u0443\u0440, \u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u043e\u0431\u044a\u0451\u043c\u044b \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0440\u0430\u0437\u0432\u0451\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0438 \u043f\u0440\u0435\u0434\u0441\u043a\u0430\u0437\u0443\u0435\u043c\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430.\u0421\u043b\u043e\u0439\u0412\u044b\u0431\u043e\u0440\u041f\u043e\u0447\u0435\u043c\u0443\u0421\u0435\u0440\u0432\u0435\u0440\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044cGo 1.25 + chi router\u041e\u0434\u0438\u043d \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a, \u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u0441\u0442\u0430\u0440\u0442, \u0445\u043e\u0440\u043e\u0448\u0430\u044f \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u0438 \u0443\u0434\u043e\u0431\u043d\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u0434\u043b\u044f \u0444\u043e\u043d\u043e\u0432\u043e\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438.\u0411\u0430\u0437\u0430PostgreSQL 16JSONB \u0434\u043b\u044f enrichment-\u0434\u0430\u043d\u043d\u044b\u0445, \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0442\u044f\u0436\u0451\u043b\u044b\u0445 \u0432\u0438\u0442\u0440\u0438\u043d, \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u044b\u0435 \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0434\u043b\u044f \u0447\u0430\u0441\u0442\u044b\u0445 \u0432\u044b\u0431\u043e\u0440\u043e\u043a \u0438 \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u0436\u0443\u0440\u043d\u0430\u043b\u0430 \u0430\u0443\u0434\u0438\u0442\u0430.\u041e\u0447\u0435\u0440\u0435\u0434\u044cRedis 7 Streams\u0414\u043b\u044f \u0444\u043e\u043d\u043e\u0432\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u043d\u0443\u0436\u043d\u0430 \u043d\u0430\u0434\u0451\u0436\u043d\u0430\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0441 \u0433\u0440\u0443\u043f\u043f\u0430\u043c\u0438 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0435\u0439. Kafka \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u0451\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u043e\u0434\u043d\u043e\u0439 \u043d\u043e\u0434\u0435 \u0431\u044b\u043b\u0430 \u0431\u044b \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u043e\u0439.\u041a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0430\u044f \u0447\u0430\u0441\u0442\u044cReact 18 + TypeScript strict + ViteTanStack Table, Query \u0438 Virtual \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0442\u044f\u0436\u0451\u043b\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430: \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0444\u0438\u043b\u044c\u0442\u0440\u044b \u0438 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e.\u0421\u0442\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u044fTailwind CSS + shadcn\/ui\u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0431\u044b\u0441\u0442\u0440\u043e \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0431\u0435\u0437 \u0440\u0443\u0447\u043d\u043e\u0439 CSS-\u0444\u0435\u0440\u043c\u044b. \u0422\u0451\u043c\u043d\u0430\u044f \u0442\u0435\u043c\u0430 &#8212; \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e.\u0414\u043e\u0441\u0442\u0443\u043f \u043a \u0411\u0414pgx\/v5, \u0431\u0435\u0437 ORM\u041d\u0443\u0436\u0435\u043d \u043f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c \u043d\u0430\u0434 SQL, \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u043c\u0438, \u043f\u043b\u0430\u043d\u0430\u043c\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435\u043c \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u0445.\u041c\u0438\u0433\u0440\u0430\u0446\u0438\u0438golang-migrate\u041f\u0440\u043e\u0441\u0442\u044b\u0435 SQL-\u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u0431\u0435\u0437 \u043b\u0438\u0448\u043d\u0435\u0439 \u043c\u0430\u0433\u0438\u0438 \u0438 \u0441\u043a\u0440\u044b\u0442\u044b\u0445 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0439.\u0420\u0430\u0437\u0432\u0451\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435Docker Compose\u0411\u0435\u0437 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e Kubernetes. \u041e\u0434\u0438\u043d up -d -\u0438 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u043f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0431\u044b\u0447\u043d\u043e\u0439 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u043a\u0435.\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u044f \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0432 CLAUDE.md \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f. \u041e\u043d\u0438 \u0443\u0436\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437 \u0441\u043f\u0430\u0441\u0430\u043b\u0438 \u043f\u0440\u043e\u0435\u043a\u0442 \u043e\u0442 \u043c\u043e\u0438\u0445 \u0436\u0435 \u0438\u043c\u043f\u0443\u043b\u044c\u0441\u043e\u0432 \u201c\u0430 \u0434\u0430\u0432\u0430\u0439 \u043f\u0440\u0438\u043a\u0440\u0443\u0442\u0438\u043c \u0435\u0449\u0451 \u0432\u043e\u0442 \u044d\u0442\u043e\u201d:\u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e ORM &#8212; \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0438\u0441\u0442\u044b\u0439 SQL \u0447\u0435\u0440\u0435\u0437 pgx\/v5;\u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u043f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u0438 \u0447\u0435\u0440\u0435\u0437 OFFSET &#8212; \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u0443\u0440\u0441\u043e\u0440\u043d\u0430\u044f \u043f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u044f;\u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043d\u043e\u0432\u044b\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0431\u0435\u0437 \u044f\u0432\u043d\u043e\u0433\u043e \u043e\u0431\u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u044f;\u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0446\u0438\u0439 \u201c\u043d\u0430 \u0431\u0443\u0434\u0443\u0449\u0435\u0435\u201d &#8212; \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u043e\u0433\u0434\u0430, \u043a\u043e\u0433\u0434\u0430 \u0435\u0441\u0442\u044c \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u0434\u0432\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.\u042f \u043f\u043e\u043d\u0438\u043c\u0430\u044e, \u0447\u0442\u043e \u0444\u0440\u0430\u0437\u0430 \u201c\u0431\u0435\u0437 ORM\u201d \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u0438\u0445 \u0437\u0432\u0443\u0447\u0438\u0442 \u0441\u043f\u043e\u0440\u043d\u043e. \u0414\u0430\u043b\u044c\u0448\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443, \u043f\u043e\u0447\u0435\u043c\u0443 \u0432 \u044d\u0442\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u044d\u0442\u043e \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043d\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435\u043c, \u0430 \u043e\u0441\u043e\u0437\u043d\u0430\u043d\u043d\u044b\u043c \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c.\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430: \u043a\u0443\u0434\u0430 \u0447\u0442\u043e \u0442\u0435\u0447\u0451\u0442\u042f \u043d\u0435 \u0445\u0443\u0434\u043e\u0436\u043d\u0438\u043a, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0442\u043e\u0436\u0435 \u0440\u0438\u0441\u043e\u0432\u0430\u043b\u043e \u0418\u0418\u041f\u0430\u0440\u0441\u0435\u0440\u044b: \u0430\u0432\u0442\u043e\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0432\u043c\u0435\u0441\u0442\u043e \u201c\u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u201d\u0412 DefectDojo \u043f\u0440\u0438 \u0438\u043c\u043f\u043e\u0440\u0442\u0435 \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0442\u0438\u043f \u0441\u043a\u0430\u043d\u0435\u0440\u0430. \u042f \u0445\u043e\u0442\u0435\u043b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438\u043d\u0430\u0447\u0435: \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0444\u0430\u0439\u043b, \u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u0441\u0430\u043c\u0430 \u043f\u044b\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u043d\u044f\u0442\u044c, \u0447\u0442\u043e \u043f\u0435\u0440\u0435\u0434 \u043d\u0435\u0439.\u0421\u0435\u0439\u0447\u0430\u0441 \u0432 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 \u0435\u0441\u0442\u044c 10 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0445 \u043f\u0430\u0440\u0441\u0435\u0440\u043e\u0432:\u041f\u0430\u0440\u0441\u0435\u0440\u0424\u043e\u0440\u043c\u0430\u0442\u0422\u0438\u043f&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-479222","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/479222","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=479222"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/479222\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=479222"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=479222"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=479222"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}