Почему не записываются данные в файл?

Ссылка скопирована
1 ответ

В вордпресс у меня есть два сниппета:
JS, который снимает отпечаток посетителя и отправляет их в бек, я этот код проверил, он все отправляет, по крайне мере должен:

const fpPromise = import('https://openfpcdn.io/fingerprintjs/v4')       .then(FingerprintJS => FingerprintJS.load())      // Get the visitor identifier when you need it.     fpPromise       .then(fp => fp.get())       .then(result => {         // This is the visitor identifier:         const visitorId = result.visitorId         console.log(result)         fetch('http://localhost:81', {       method: 'POST',       headers: {         'Content-Type': 'application/json;charset=utf-8'       },       body: JSON.stringify(result)     })       })

const fpPromise = import('https://openfpcdn.io/fingerprintjs/v4') .then(FingerprintJS => FingerprintJS.load()) // Get the visitor identifier when you need it. fpPromise .then(fp => fp.get()) .then(result => { // This is the visitor identifier: const visitorId = result.visitorId console.log(result) fetch('http://localhost:81', { method: 'POST', headers: { 'Content-Type': 'application/json;charset=utf-8' }, body: JSON.stringify(result) }) })

PHP, на счет него не уверен, так как первый раз работаю), он должен данные принять и записать в файл:

$json = file_get_contents('php://input');  $ip = $_SERVER['REMOTE_ADDR']; $browser = $_SERVER['HTTP_USER_AGENT'];  $dateTime = date('Y-m-d H:i:s');  file_put_contents('fingerprints/1.json', $json . PHP_EOL, FILE_APPEND);  $visitorData = [   'ip' => $ip,   'browser' => $browser,   'dateTime' => $dateTime ];  $visitorJson = json_encode($visitorData);    file_put_contents('fingerprints/1.json', $visitorJson . PHP_EOL, FILE_APPEND);

$json = file_get_contents('php://input'); $ip = $_SERVER['REMOTE_ADDR']; $browser = $_SERVER['HTTP_USER_AGENT']; $dateTime = date('Y-m-d H:i:s'); file_put_contents('fingerprints/1.json', $json . PHP_EOL, FILE_APPEND); $visitorData = [ 'ip' => $ip, 'browser' => $browser, 'dateTime' => $dateTime ]; $visitorJson = json_encode($visitorData); file_put_contents('fingerprints/1.json', $visitorJson . PHP_EOL, FILE_APPEND);

И может быть такое, что backend не примет данные потому-что они большие?

Дополнительно:

так проверили или нет?
отправляет или "должен"?
какая проблема проверить и не заниматься гаданием?

  • Ипатьев, фронт работает, весь вопрос в том, почему не записывает в файл часть та, которая приходит с фронта
  • Простите, но я не спрашивал, работает ли фронт.
    Я задал очень простой вопрос: вы проверили, что именно отправляет фронт на сервер?
    Почему вы не можете дать на него такой же простой ответит?
    Вы в курсе про инструменты разработчика? Про вкладку Сеть? про то что там можно посмотреть конкретное содержимое запроса, переданного на сервер?
    А заодно, если запрос все-таки корректный - и ответ сервера?
  • Не надо ставить как можно больше тэгов. Лучше оставить один, но конкретный, с которым проблема.
    См.п.3.1 Регламента.
  • Ответы:

    Как все новички, вы оперируете понятием "может быть".
    "может быть сервер не принимает". "по крайне мере должно отправлять". "насчет РНР не уверен"
    Так делать никогда не надо.
    У вас есть все возможности узнать то, что происходит на самом деле. Факты.
    Вот фактами-то и надо всегда оперировать.
    Какая вам разница, "может ли быть такое, что backend не принимает"? Может. И чем вам это знание поможет?
    Вам не нужно знать абстрактно, вам нужно знать, принял ли ваш конкретный сервер ваши конкретные данные.
    А узнать это очень просто. Если "backend не принимает", то но выдаст ошибку. Все что вам нужно - это посмотреть, что он возвращает. Глазами.
    Плюс на всякий случай проверить, настроен ли backend на вывод ошибок.

    При работе с аякс запросами надо всегда держать открытой вкладку Сеть в инструментах разработчика в браузере.
    И смотреть, во-первых, что ваш фронт отправляет, а во-вторых - что сервер отвечает. Там вообще может быть 404. Поскольку никакого конкретного адреса вы на сервере не указали.
    Плюс если ответ сервера есть, то надо смотреть его содержимое на предмет ошибок.

    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Редакция Security Ответ

    В вашем примере JS отправляет JSON на http://localhost:81. Если код выполняется в браузере посетителя, localhost — это компьютер посетителя, а не ваш сервер WordPress. Поэтому данные могут вообще не доходить до нужного PHP-обработчика. Нужно отправлять запрос на URL вашего сайта или REST endpoint WordPress.

    Правильнее сделать endpoint:

    add_action('rest_api_init', function () {
        register_rest_route('fp/v1', '/save', [
            'methods'  => 'POST',
            'callback' => 'save_fingerprint',
            'permission_callback' => '__return_true',
        ]);
    });
     
    function save_fingerprint(WP_REST_Request $request) {
        $data = $request->get_json_params();
        file_put_contents(WP_CONTENT_DIR . '/fp.log', wp_json_encode($data) . PHP_EOL, FILE_APPEND);
        return ['ok' => true];
    }

    add_action('rest_api_init', function () { register_rest_route('fp/v1', '/save', [ 'methods' => 'POST', 'callback' => 'save_fingerprint', 'permission_callback' => '__return_true', ]); }); function save_fingerprint(WP_REST_Request $request) { $data = $request->get_json_params(); file_put_contents(WP_CONTENT_DIR . '/fp.log', wp_json_encode($data) . PHP_EOL, FILE_APPEND); return ['ok' => true]; }

    А в JS отправлять так:

    fetch('/wp-json/fp/v1/save', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify(result)
    });

    fetch('/wp-json/fp/v1/save', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(result) });

    Если запись в файл не происходит, проверьте права на директорию и путь. WordPress/PHP может не иметь права писать рядом с файлом скрипта. Для логов используйте wp-content/uploads или свою директорию внутри wp-content, созданную с правильными правами.

    И ещё важный момент: fingerprint посетителя — персональные/поведенческие данные. Для продакшена нужна правовая основа, политика обработки и аккуратное хранение. Не пишите такие данные в публично доступный файл, который можно скачать по прямой ссылке.

    Если endpoint будет принимать данные от незалогиненных пользователей, добавьте хотя бы nonce, rate limit или проверку origin, иначе этот URL смогут заспамить. Для простого лога это особенно важно: файл быстро разрастётся, а при публичном доступе ещё и станет утечкой данных. В продакшене лучше писать в отдельную таблицу с ограниченным набором полей.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно