Кратко
В архиве платёжного плагина не должно быть ключей, и в пакете Paymos их нет: файл одинаков для всех мерчантов и не несёт ни API-ключа, ни API-секрета, ни идентификатора проекта, ни секрета вебхука, ни токена доступа, ни кода устройства. Вручную их потом тоже не вписывают: подключение магазина — это одно подтверждение, и ключи, вебхук и привязка к проекту выдаются в нём же. Сборка под конкретного мерчанта покупает короткую настройку ценой живого секрета в файле. Проверяются два признака: поиск по распакованному архиву и контрольная сумма.
Пакет плагина Paymos не несёт учётных данных. Архив, который мерчант скачивает для WooCommerce, Magento 2 или любого из шести остальных официальных плагинов, — это тот же самый архив, что скачивают все, и внутри нет ни API-ключа, ни API-секрета, ни идентификатора проекта, ни секрета вебхука, ни токена доступа, ни кода устройства. Само скачивание ничего не подключает.
Ни один следующий шаг их туда тоже не кладёт. Подключение магазина — это одно подтверждение, ключи, вебхук и привязка к проекту выдаются в том же шаге, а дальше хранятся зашифрованными на стороне магазина. Ввести или отредактировать их вручную нельзя.
Пустой архив — это замысел, а не мелочь. Пакет, собранный под конкретного мерчанта, с уже вписанными ключами, — это живой секрет внутри файла, а файл путешествует: в папку загрузок, в ночную резервную копию, во вложение к обращению в поддержку и в репозиторий, где лежит тема сайта.
Установка описана в руководстве по WooCommerce и на семи страницах рядом с ним. Здесь — слой под ними: что архив плагина в принципе способен нести, что несёт архив Paymos и как проверить тот, который выдаёт вам ваш шлюз.
Что лежит внутри пакета платёжного плагина?
Пакет платёжного плагина — это архив с кодом: расширение, которое устанавливает CMS, и файлы, описывающие его магазину. Содержимое одинаково у всех, кто его скачал, и ничего специфичного для конкретного мерчанта внутри нет: ни имени магазина, ни номера аккаунта в нём не появляется.
Открывать архив стоит из-за того, что рабочей интеграции в итоге нужно: API-ключ, API-секрет, привязка к проекту и секрет вебхука. У шлюза поэтому есть выбор, когда эти вещи появляются, — на сборке, вписанными в файл, или при подключении, выданными потом.
Paymos делает этот выбор в пользу подключения. Маршрут скачивания отдаёт статический файл, а не собирает его под аккаунт, поэтому архив одинаков для каждого мерчанта и ни одного из перечисленных типов данных не несёт. Проверить это можно снаружи, ни у кого не спрашивая.
Зачем вообще класть ключи в скачиваемый файл?
Ключи вписывают в скачиваемый файл, чтобы снять с мерчанта работу по настройке. Логика такая: магазин, которому нечего настраивать, должен был получить что-то, что уже знает, кому оно принадлежит, — иначе откуда бы взялось подключение. Довод держится ровно до вопроса, где именно эти ключи лежат.
Платит за это сокращение сам архив. Ключ, вписанный в архив плагина, превращает код в документ на предъявителя: кто держит файл, тот владеет аккаунтом, под который файл собрали, а держать файл — очень низкая планка. Отозвать уже розданный файл при этом не получится.
Такой ключ ещё и склеивает два разных события. Получение кода не требует аккаунта и повторяется кем угодно сколько угодно раз; подключение магазина проходит с аутентификацией и случается однажды. Архив с ключом соединяет их в одно — вместе с разной ценой ошибки, которая у этих двух событий тоже разная.
MITRE описывает общий случай как CWE-798, Use of Hard-coded Credentials: «продукт содержит зашитые учётные данные, такие как пароль или криптографический ключ». Классический пример там — один секрет на все установки; сборка под мерчанта переворачивает это, давая каждому файлу свой, и сохраняет главное — живой секрет, лежащий в распространяемом файле.
Куда попадает архив плагина после скачивания?
Архив плагина не остаётся там, куда его скачали. Папка загрузок — первая остановка из нескольких, и ни одну из следующих не выбирали с мыслью о секрете внутри файла, потому что в эти минуты о нём никто не думает:
- Папка загрузок на ноутбуке, без шифрования, ровно столько времени, сколько её никто не разбирает.
- Ночная резервная копия сайта, а за ней каждая точка восстановления, которую эта копия породила.
- Вложение в обращение в поддержку — в ту минуту, когда мерчант отправляет «тот самый плагин» тому, кто ему помогает.
- Репозиторий сайта под контролем версий, рядом с темой оформления.
- Машина подрядчика: переслать файл — самый быстрый способ передать работу.
Для архива без учётных данных все пять — ничего не значащие события: файл несёт публичные байты и не раскрывает ничего. Для архива с вписанным ключом все пять — раскрытие, и у мерчанта нет записи о том, сколько их уже случилось.
Как проверить, что присылает ваш шлюз?
Архив плагина проверяют так: распаковывают и обыскивают — до того, как он доедет до сайта. Три команды закрывают вопрос, ни одной из них не требуется согласие шлюза, и на любой машине это занимает пару минут.
# 1. распакуйте архив до того, как он попадёт в магазин
unzip -q plugin.zip -d pkg
# 2. поищите всё, что похоже на живые учётные данные
grep -rIn -iE 'api[_-]?key|secret|token|client_id|device_code' pkg
# 3. посчитайте хеш и сравните со второй загрузкой того же релиза
shasum -a 256 plugin.zip
Флаг -i во втором шаге не украшение: константу пишут и API_KEY, и ApiKey, и api_key, а поиск с учётом регистра проходит мимо двух вариантов из трёх. На публичном исходном коде плагина Paymos для WooCommerce этот шаблон даёт 65 строк с -i и 63 без него.
Читать совпадения нужно как имена полей, подписи и строки перевода, а не как находки. В том же дереве 38 из них лежат под tests/, где заготовки вида 'api_key' => 'pk_test_1234567890' стоят по замыслу. Останавливаться стоит на совпадении с настоящим значением вне тестовой папки.
Контрольная сумма закрывает то, на что поиск только намекает. Скачайте тот же релиз второй раз с другой машины и посчитайте хеш этой копии: архив, одинаковый для всех мерчантов, даст один и тот же хеш дважды, а собранный под аккаунт — не сможет.
Если в архиве пусто, откуда плагин берёт ключи?
Ключи плагин получает одним подтверждением. Поставьте релиз, нажмите в админке магазина «Подключить Paymos», подтвердите запрос во вкладке Paymos — и этот шаг выдаёт всё остальное. Полей для ручного ввода в нём нет ни одного:
- Ключи. Берётся активный платёжный ключ мерчанта, а если его нет — создаётся; тестовый и рабочий режим приходят вместе, поэтому переход на рабочий позже подключения не требует.
- Вебхук. Вебхук инвойсов регистрирует сама платформа: существующий используется повторно только при совпадении адреса, категории и проекта, а конфликтующий вебхук по тому же адресу молча не перезаписывается.
- Проект. В плагине он не выбирается вообще — привязывается тот, который открыт в панели, и второго выбора в этом сценарии нет.
Аргумент про экономию времени поэтому отвечает сам себе. Сборка под мерчанта покупает короткую настройку ценой секрета в файле; магазин, подключённый описанным способом, тоже ничего не настраивал, а файл, который он поставил, по-прежнему пуст. Экономить здесь попросту нечего.
Почему один архив годится всем мерчантам?
Один архив годится всем, потому что плагин — это код, а внутри кода аккаунта нет. Экосистемы CMS исходят ровно из этого, и правила распространения написаны вокруг такого допущения: каталоги, зеркала и страницы релизов устроены под один файл на версию, а не под индивидуальную сборку.
WordPress формулирует допущение прямо, правилом каталога: «Единственная версия плагина, которую распространяет WordPress.org, — та, что лежит в каталоге». Один артефакт на версию, отдаваемый всем, — это форма, в которой CMS ожидает получить плагин, каким бы каналом он ни пришёл.
Сборка под мерчанта ни в один такой канал не помещается. Её нельзя опубликовать как релиз, нельзя сверить с публичной версией и нельзя сравнить между версиями — просто потому, что единственной опубликованной версии, с которой сравнивают, не существует.
Paymos раздаёт свои восемь официальных плагинов публичными релизами: один пакет на платформу на релиз, и маршрут скачивания отдаёт именно этот статический файл. Каждый релиз даёт по одному архиву для WooCommerce и WHMCS, OpenCart и PrestaShop, Magento 2 и Shopware 6, CS-Cart и Easy Digital Downloads.
Что даёт пакет без секретов в обычной работе?
Пакет без учётных данных не даёт трём обычным операциям превратиться в утечку: передаче файла, ротации ключа и замене плагина. Все три случаются на обычной рабочей неделе, а не в редком аварийном сценарии, и в другой модели каждая требовала бы отдельной осторожности.
Передать файл разработчику, агентству или коллеге — значит не раскрыть ничего: архив Paymos и так есть у всех остальных. Переслать его почтой или в мессенджере можно так же спокойно — двигается не тот объект, который даёт доступ.
Ротация не требует свежего скачивания. Ключ и архив — разные объекты, поэтому после ротации всё, что нужно, — подключить магазин заново, и порядок этот один и тот же для ключа и для секрета вебхука. У секрета вебхука вдобавок есть период, в котором принимаются подписи и текущим, и предыдущим секретом.
OWASP ставит ротацию туда же: «Секреты следует регулярно ротировать, чтобы украденные учётные данные работали недолго». Ротация, которая начинается с повторного скачивания плагина, — это ротация, которую откладывают, а замена самого архива при этом остаётся операцией с кодом: секрету оттуда переезжать некуда, потому что его там не было.
Чего пустой архив не доказывает?
Архив без учётных данных доказывает ровно одно: файл не нёс секрета. Утверждение это узкое, и выдавать его за проверку безопасности не стоит — два вопроса оно оставляет открытыми, и оба весят больше того, на который оно ответило.
Первый — хранение. Как только ключ доехал до магазина, что-то там обязано его держать, и как именно — отдельное свойство с отдельным ответом: плагины Paymos хранят эти значения зашифрованными на стороне магазина, в браузер не возвращают и править вручную не дают.
Второй — поведение на живом магазине. Архив — это снимок кода, поэтому чтение архива говорит, что плагин способен делать, а не что он делает, когда через него идут настоящие счета и настоящие деньги. Между снимком и работой лежит ещё вся конфигурация магазина.
Ответа заслуживают оба, и контрольная сумма не закрывает ни одного. Проверка архива — дешёвая часть: несколько минут работы, которые убирают целый класс раскрытия ещё до того, как что-то установлено. Оба вопроса стоит задать тому же шлюзу и тем же письмом.
Насколько узким должен быть сам ключ?
Ключ, попадающий в CMS, должен быть самым узким из тех, что справляются с задачей: магазин — общая машина, и папку плагинов читает любой, у кого есть админский доступ. Модель Paymos сужает его до того, как вопрос задан.
Подключение выдаёт платёжный ключ, а платёжные ключи и ключи выплат разделены, поэтому плагин оплаты никогда не держит тот, которым выводят средства. Тестовый и рабочий режим работают на разных ключах против одного и того же контракта API, поэтому ключ, на котором проверяли, — не тот, которым принимают настоящие платежи.
Ключ Paymos может нести список разрешённых IP-адресов, до 50 записей, и это привязывает его к адресам, с которых работает магазин. Копия такого ключа, предъявленная откуда-то ещё, отклоняется, поэтому ключ, вынутый из резервной копии, — уже не работающий ключ.
Аутентификация Merchant API — это подпись запроса по HMAC-SHA256, а не токен на предъявителя, поэтому секрет подписывает запрос, а не едет внутри него. Перехваченный запрос не даёт ключа для следующего, а модель ключей разобрана целиком отдельно.
Что спросить до установки платёжного плагина?
Четыре вопроса закрывают тему учётных данных в платёжном плагине. На все четыре можно ответить до того, как файл доедет до сайта, и ни одному из них не нужен доступ к чужой инфраструктуре.
- Одинаков ли архив у всех? Посчитайте хеш своей загрузки, возьмите тот же релиз с другой машины и сравните.
- Есть ли в архиве живое значение? Поищите в распакованных файлах строки, похожие на учётные данные; имена полей и заготовки находками не считаются.
- Куда плагин кладёт учётные данные после подключения? Это место в документации, а не в ответе поддержки.
- Насколько узок ключ, который он держит? Плагин оплаты с правами на вывод несёт больше, чем нужно для его работы.
Ни один из четырёх не является аудитом безопасности, а вместе они исключают отказ, у которого нет шага восстановления: секрет, уже скопированный туда, где никто не вёл список. Это самый дешёвый способ потерять ключ — и самый частый.
Плагин — один из маршрутов от магазина до платёжной инфраструктуры. Другие способы принимать оплату на сайте разобраны отдельно, а интеграция через REST API — это как раз случай, когда проверять нечего, потому что архива нет. Каким бы маршрутом магазин ни пошёл, его ключ должен начинаться там, а не в файле, который уже успел попутешествовать.
| Учётные данные | Вписаны в скачиваемый архив | Откуда берутся вместо этого | |
|---|---|---|---|
| API-ключ | Нет | Выдаётся при подключении, тестовый и рабочий сразу | |
| API-секрет | Нет | Выдаётся при подключении, магазин хранит его зашифрованным | |
| Идентификатор проекта | Нет | Привязывается из панели, в плагине не выбирается | |
| Секрет вебхука | Нет | Создаётся вместе с вебхуком, который регистрирует платформа | |
| Токен OAuth или код устройства | Нет | Короткоживущий, тратится при подключении и удаляется |
Частые вопросы
Есть ли в скачанном плагине Paymos мой API-ключ?
Нет. Архив не несёт ни API-ключа, ни API-секрета, ни идентификатора проекта, ни секрета вебхука, ни токена доступа, ни кода устройства. Всё это выдаётся позже, одним подтверждением при подключении.
Что нужно настроить после установки плагина?
Ничего. Подключение — это кнопка в админке магазина и подтверждение во вкладке Paymos; ключи, вебхук и привязка к проекту выдаются в этом же шаге.
Отличается ли файл плагина для разных мерчантов?
Нет. Скачиваемый пакет одинаков для всех, поэтому две загрузки одного релиза дают одни и те же байты и одну и ту же контрольную сумму.
Где плагин Paymos хранит ключи после подключения?
На стороне магазина, в зашифрованном виде, и в браузер они не возвращаются. Ключ живёт у магазина, а не внутри распространяемого архива, поэтому замена архива никакого секрета не двигает.
Как проверить, есть ли в пакете плагина секреты?
Распакуйте архив и поищите в нём строки, похожие на учётные данные, а затем сравните контрольную сумму со второй загрузкой того же релиза. Имена полей в выдаче ожидаемы, значения — нет, а совпадение под тестовой папкой — это заготовка.
Подключает ли скачивание плагина мой магазин?
Нет. Скачивание перемещает код и больше ничего. Магазин подключается отдельным шагом, одним подтверждением из его админки.
Какой именно ключ оказывается у плагина?
Платёжный. Платёжные ключи и ключи выплат разделены, поэтому плагин оплаты никогда не держит тот, которым выводят средства.
Когда НЕ стоит использовать проверку архива
- Если вопрос в том, как магазин хранит ключ после подключения, осмотр архива на него не отвечает. Пустой файл ничего не говорит о хранении — читайте документацию плагина про хранение учётных данных.
- Если интеграция написана вами против REST API, а не собрана из готового плагина, проверять нечего — архива нет. Смотрите на путь выкладки, где живут переменные окружения, переменные сборки и файлы конфигурации.
- Если вам нужны учётные данные, которые сам сервер прочитать не может, плагин на вашем же хостинге — не то место, где их стоит искать. Что магазин может предъявить API, то он может и хранить.
- Если шлюз не даёт скачать файл вообще и ставит расширение из своей панели, сравнивать контрольную сумму не с чем. Спрашивайте, куда записывается секрет и кто ещё может прочитать это место.
Источники
- 1. CWE-798: Use of Hard-coded Credentials (accessed 2026-08-16)
- 2. OWASP Secrets Management Cheat Sheet (accessed 2026-08-16)
- 3. WordPress Plugin Directory guidelines (accessed 2026-08-16)
- 4. Документация Paymos — плагин WooCommerce (accessed 2026-08-16)
Последняя проверка: 16 авг. 2026 г.


