Предложения по Пикабу
18 постов
18 постов
402 поста
29 постов
69 постов
6 постов
1 пост
4 поста
7 постов
3 поста
На WordPress присутствует уязвимость, через которую на сайте моего клиента проникли в админку
Согласно access.log:
Он выполнил несколько каких-то POST-запрос с URL содержащий GET-параметр rest_route=/batch/v1, по словам клиента он сменил пароль администратора, а также я обнаружил что он создал новый аккаунт с правами администратора
Он успешно зашёл в какой-то аккаунт с правами администратора через обычную форму авторизации
Он установил и активировал плагин замаскированный под какой-то полезный плагин, который позволяет злоумышленникам выполнять любые Linux-команды на сервере через GET-запрос
Просьба выполнить следующие действия:
В каталоге wp-content/plugins создать каталог lock-rest-route
Каталог wp-content находится в каталоге сайта
В только что созданном каталоге создать файл lock-rest-route.php
Открыть файл в любом редакторе кодов (например: Notepad++ или Visual Studio Code) и вставить этот код:
<?php
/**
* Plugin Name: Lock Rest Route
* Description: Блокировка rest_route для закрытия уязвимости
* Version: 1.0.0
* Author: pikabu.ru/@FanFigureSkating
* Author URI: https://pikabu.ru/@FanFigureSkating
*/
add_action( 'init', 'lock_rest_route', -1000 );
function lock_rest_route() {
if (isset($_GET['rest_route']) || (strpos((isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : ''), 'batch/v1') !== false)) {
header('HTTP/1.1 403 Forbidden', true, 403);
die();
}
}
И сохранить изменения, затем зайти в админку и активировать плагин "Lock Rest Route". И всё, можете спать спокойно
Этот плагин наглухо закрывает такую уязвимость, блокируя rest_route на раннем этапе и наглухо блокируя batch/v1
Не деактивируйте этот плагин и не удаляйте этот файл, даже если кто-то просит. Просить деактивировать плагин или удалить файл (или каталог) могут только злоумышленники
В Yandex Cloud нельзя редактировать фотографию, в Gigachat API тоже нельзя редактировать фотографию. Также в Yandex Cloud и Gigachat API нельзя загружать изображения-референсы для генерации изображений
ChatGPT, Gemini API и Nano Banana в России не работают. Google Cloud российские карты не принимает. И находясь в России, нельзя получить API-ключ для использования Gemini API
Поэтому предлагаю сделать Пикабу Нейро API, который будет доступен на любом тарифе (начиная с тарифа Старт)
Этот уникальный российский API будет генерировать тексты, изображения и видео точно так же, как и в интерфейсе Пикабу Нейро
Будут два формата API: на основе OpenAI и свой формат Пикабу Нейро API
Этот формат предназначен для приложений и библиотек которые работают с OpenAI (например: n8n), но будут серьёзные ограничения. Можно только отправлять текстовые запросы (без загрузки файлов), получать текстовые ответы и получать список доступных текстовых моделей
Статистика расходов в каждом ответе будет отображаться так: 1 потраченный исходящий токен = 0,1 потраченных кредитов (почему потраченных токенов может быть только целое число (integer), а количество кредитов - это дробное число (float)), а все остальные потраченные токены будут всегда 0
Генерировать изображения и видео, а также делать запросы с изображениями нельзя
Это собственная разработка Пикабу Нейро API. В отличии от OpenAI можно генерировать не только текст, но и ещё изображения и видео. И в запрос можно вставлять изображения-референсы и другие поддерживаемые файлы
Сервер отправляет ответы в формате JSON и принимает POST-запросы в формате JSON (если не указано иное)
Примеры методов:
GET /v1/get_balance - получить баланс кредитов
Ответ:
balance (float) - остаток кредитов на счёте
extra_balance (float) - остаток докупленных кредитов
total_balance (float) - общий баланс (balance + extra_balance)
expire (integer) - timestamp истечения действующего тарифа
GET /v1/get_models - получить доступные модели
Ответ:
text_models (array of string) - текстовые модели
image_models (array of string) - модели генерации изображений
video_models (array of string) - модели генерации видео
POST /v1/chat - отправка запроса (самый главный метод)
Запрос:
messages (array of object) - массив с историей сообщений, последнее сообщение - это сам запрос (обязательно, хотя бы один объект с role=user)
role (string enum("system", "assistant", "user")) - роль автора сообщения, сообщение с ролью system должно быть не больше одного, и оно должно быть только на первом месте, а последнее сообщение должно быть с ролью user (обязательно)
content (string) - сообщение (обязательно)
files (array of string) - список UUID файлов (необязательно, по умолчанию: пусто)
text_model (string) - модель генерации текста (необязательно, по умолчанию: gpt_6_luna)
image_model (string) - модель генерации изображения (необязательно, по умолчанию: nano_banana_2_lite)
video_model (string) - модель генерации видео (необязательно, по умолчанию: grok_imagine_video_1_5)
Ответ:
type (string enum("text", "image", "video")) - тип ответа
message (string) - сообщение
file (string|null) - UUID сгенерированного файла
expire (integer|null) - timestamp истечения срока хранения сгенерированного файла
usage (object) - потраченные кредиты
credits (float) - расход основных кредитов
extra_credits (float) - расход докупленных кредитов
total_credits (float) - общий расход (credits + extra_credits)
POST /v1/chat_async - асинхронная отправка запроса
Запрос:
Формат тот же что и у POST /v1/chat
Ответ:
request_id - UUID асинхронного запроса
expire (integer) - timestamp истечения срока хранения результата асинхронного запроса
GET /v1/check_async - проверить асинхронный запрос и получить на него ответ (если есть)
Запрос в query:
request_id (string) - UUID асинхронного запроса (обязательно)
Ответ:
status (string enum("pending", "success", "error")) - текущий статус асинхронного запроса
type (string enum("text", "image", "video"), если status=success) - тип ответа
message (string, если status=success) - сообщение
file (string|null, если status=success) - UUID сгенерированного файла
expire (integer|null, если status=success) - timestamp истечения срока хранения сгенерированного файла
usage (object, если status=success) - потраченные кредиты
credits (float) - расход основных кредитов
extra_credits (float) - расход докупленных кредитов
total_credits (float) - общий расход (credits + extra_credits)
error_message (string, если status=error) - сообщение об ошибке
GET /v1/get_file - получить содержимое файла
Запрос в query:
file_id (string) - UUID файла (обязательно)
Отправляется бинарный ответ содержимого файла, заголовок Content-Type содержит MIME-тип файла, Content-Disposition содержит имя файла с UUID и расширением файла, а Content-Length содержит размер файла
POST /v1/upload_file - загрузить файл
Запрос в формате multipart/form-data:
file (file) - сам файл (обязательно)
Ответ:
file (string) - UUID загруженного файла
expire (integer|null) - timestamp истечения срока хранения загруженного файла
API-ключ можно будет получить на сайте Пикабу Нейро, в настройках. API-ключ показывается только 1 раз, в случае потери можно будет только получить новый API-ключ. При получении нового API-ключа, старый API-ключ будет аннулирован
При использовании собственного формата Пикабу Нейро API, каждый HTTP-запрос должен содержать заголовок Authorization: Bearer API_КЛЮЧ (где API_КЛЮЧ - это сам API-ключ)
При использовании формата на основе OpenAI, API-ключ вставляется туда же, куда вставляется API-ключ OpenAI
200 - успешный запрос
400 - невалидный JSON в POST-запросе
401 - отсутствует API-ключ, неверный API-ключ или API-ключ аннулирован
402 - закончились кредиты или используется Базовый тариф
403 - попытка получить доступ к чужому файлу или к чужому асинхронному запросу
404 - либо метод не найден, либо не найден файл/асинхронный запрос
405 - HTTP-метод запроса не соответствует HTTP-методу определённого метода
410 - срок хранения файла/асинхронного запроса истёк
413 - размер загружаемого файла превышает максимальный
415 - неподдерживаемый тип загружаемого файла
422 - отсутствуют обязательные поля в запросе, несоответствие типа поля в запросе или значение не входит список допустимых значений у string enum
429 - слишком много запросов
500 - внутренняя ошибка сервиса Пикабу Нейро
При использовании собственного формата Пикабу Нейро API, в случае ошибки во всех методах используется единый формат ответа:
error (integer) - дубликат HTTP-кода ответа
error_message (string) - сообщение об ошибке
При использовании формата на основе OpenAI, в случае ошибки ответ пишется в том же формате, что и в случае ошибки при использовании OpenAI API
Все пикабушники вне зависимости от рейтинга получают месячный лимит 250 кредитов на Пикабу Нейро
Этого мало. По моим подсчётам можно сгенерировать только 8 изображений в месяц. А если изображение получилось неудачно (или что-то нужно подправить) - эти изображения тоже учитываются
Поэтому предлагаю сделать тарифы топовым пикабушникам бесплатно. А какой тариф будет бесплатным - в зависимости от того, какое место по рейтингу занимает пикабушник
Предлагаю сделать так:
Старт - 1600 кредитов в месяц - бесплатно для пикабушников в топе-20000
Комфорт - 3300 кредитов в месяц - бесплатно для пикабушников в топе-5000
Премиум - 9500 кредитов в месяц - бесплатно для пикабушников в топе-500
Максимум - 16500 кредитов в месяц - бесплатно для пикабушников в топе-200
Тариф активируется автоматически
Если пикабушник получает бан, бесплатный тариф аннулируется, и после окончания бана тариф возвращается
Для пикабушников не входящие в топ-20000 предлагается сделать бонус к лимиту в Базовом тарифу в зависимости от рейтинга
Бонус: +10 кредитов за каждые 1000 единиц рейтинга, рейтинг округляется до 1000 в меньшую сторону
рейтинг меньше 1000 - бонус: +0 - лимит в Базовом тарифе: 250 кредитов
рейтинг 1000-1999 - бонус: +10 - лимит в Базовом тарифе: 260 кредитов
рейтинг 2000-2999 - бонус: +20 - лимит в Базовом тарифе: 270 кредитов
рейтинг 3000-3999 - бонус: +30 - лимит в Базовом тарифе: 280 кредитов
и т. д.
Бонус добавляется только к лимиту в Базовом тарифе. К лимиту в других тарифах бонус добавляться не будет
Забаненные пикабушники бонус не получат
А также предлагается добавить возможность купить кредиты Пикабу Нейро за монеты на Пикабу
250 кредитов за 500 монет
Тратятся после основных и не сгорают в конце периода