Задать вопрос
Ответы пользователя по тегу Веб-разработка
  • Скрипт для передачи данных, в поисках простого решения. кто может помочь?

    @rPman
    ТЗ дано, в целях - простое, про авторизацию не заикнулись...

    Реализация будет состоять из 3 частей:
    1. интерфейс - frontend
    2. серверная часть backend
    3. из-за особенности реализации backend большинством инструментов и веб серверов, регулярные операции делают сторонним скриптом, обычно его запускают средствами ОС (его шедулером), в linux это cron

    Итак, интерфейс из одного окна - окно запроса текста с кнопкой отправки с сообщением о результате, на основе html forms:
    spoiler
    <!DOCTYPE html>
    <html>
    <head>
        <title>Текстовая форма</title>
    </head>
    <body>
        <form action="script.php" method="post">
            <textarea name="text" rows="10" cols="50"></textarea>
            <br>
            <input type="submit" value="Отправить">
        </form>
    </body>
    </html>

    Бакэнд на php это эта же самая страница, но в местах где нужно менять содержимое по логике (где нужно вывести сообщение о результате) ставится <?php ... код ... ?>. Вот пример сохранения введенного сообщения пользователем в файл, имя которого будет содержать номер сессии пользователя и время (timestamp, это сделано намеренно что бы показать проблему именования файла в данной задаче при многопользовательском доступе, если использовать просто timestamp, т.е. время в секундах, то несколько одновременно посланных сообщений заменят друг друга и останется только последнее, в приведенном примере эта проблема сохранится только для одного 'пользователя' т.е. сессии браузера - открытой страницы что даже локально сложно добиться, естественно правильно делать индекс со списком файлов но зачем, задача то простая):
    spoiler
    <?php
    define("STOREPATH","/my_cool_file_database");
    
    session_start();
    
    if ($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST["text"])) {
        // Получаем текст из POST запроса
        $text = $_POST["text"];
        
        // Создаем имя файла: session_id + _ + timestamp
        $filename = STOREPATH . "/" . session_id() . "_" . time() . ".txt";
        
        try {
            // Пытаемся записать файл
            if (file_put_contents($filename, $text) !== false) {
                echo "Успешно";
            } else {
                throw new Exception("Ошибка при записи файла");
            }
        } catch (Exception $e) {
            echo "Ошибка: " . $e->getMessage();
        }
    } else {
        echo "Ошибка: Неверный запрос или отсутствуют данные";
    }
    ?>


    И соответственно скрипт удаления старых сообщений
    spoiler
    <?php
    define("STOREPATH","/my_cool_file_database");
    define("REMOVE_INTERVAL",3600); // интервал в секундах для старых сообщений
    
    // Получаем все txt файлы из директории
    foreach (glob(STOREPATH . "/*.txt") as $file) {
        // Извлекаем timestamp из имени файла
        if (preg_match('/_([0-9]+(?:\.[0-9]+)?)\.txt$/', $file, $matches)) {
            $fileTimestamp = (int)$matches[1];
            
            // Если файл старше часа - удаляем
            if (time() - $fileTimestamp > REMOVE_INTERVAL) {
                unlink($file);
            }
        }
    }
    ?>

    Само собой права доступа на каталог должны быть выставлены корректно, никаких ошибок не логируется.

    Никаких лимитов, никакой авторизации и защиты от ддос... в данном примере любой пользователь может забить содержимое диска на сервере, отсылая бессмысленно гиганские запросы с пустым текстом (пробелы например, они буду эффективно сжаты браузером)
    Ответ написан
    2 комментария
  • Как создать комнату в браузерной игре?

    @rPman
    Начни с простого чата, есть готовые примеры на основе websocket (на javascript там очень просто), идеологически это именно то что тебе нужно, потому что мультиплеерная игра это буквально чат между фронтэндами и бакэндом в обе стороны.

    Не смотри на фреймворки, ПОКА они тебе только помешают, тебе нужно понять принцип.

    Вопрос слишком всеобъемлющий, разбей задачу на подзадачи и спрашивай то что не понимаешь.
    Ответ написан
    1 комментарий
  • Как повторить post запрос в Firefox?

    @rPman
    в консоли разработчика -> сеть -> нужный запрос, правая кнопка мыши, копировать как curl

    Получишь команду вызова консольного curl, полностью повторяющее запрос (очень редко когда детектируют, через особенности ssl, были тут вопросы про это)

    Но нужно понимать, что если разработчик сайта хочет запретить автоматизацию, он может потребовать к каждому запросу прикреплять особые значения полей, которые каким-то образом вычисляются на javascript, поэтому их тоже придется анализировать и симулировать
    Ответ написан
  • Как синхронизировать проекты между компьютерами?

    @rPman
    syncting или rsync (если подойдет ручное управление) и git (не смешивая их).

    syncting хорошо работает с большими данными и любыми схемами передачи данных (вплоть до источник -> смартфон пользователя offline, смартфон -> целевая машина, и так же обратно, т.е. без интернета)

    git - дисциплинирует ставить 'точки в правильных местах', т.е. вы работаете не абы как а до commit-а, даже если вы один работаете, это дает вам историю изменений, которая может и нужна очень редко, но метко.
    Ответ написан
    Комментировать
  • Как лучше спроектировать апи с большой нагрузкой?

    @rPman
    Ты не сообщил самое главное - как будут читаться собираемые данные. Будут ли они считываться и тем более фильтроваться в процессе записи, можно ли вводить запаздывание при чтении данных (например до 'некоторых' данных в прошлом).

    Если ничего этого нет, то ничего между базой данных и бакэндом ставить не нужно... таблицы, в которые складываются данные должны быть без индексов, можно ввести искусственное партицирование, например таблица без индексов - последние не обработанные данные, вторая таблица - данные с индексами в которых будет проводиться поиск и анализ, для размазывания нагрузки использовать штатную репликацию базы данных, разные ноды - разные задачи. Кстати один из способов партицирования - писать данные блоками, каждый блок в свою новую таблицу, количество таблиц сравнимо с количеством нод, обрабатывающих их данные (таким образом можно отключить даже транзакции, ведь пока обрабатывается таблица, данные пусть пишутся в следующую, управление таблицами вести тут же на таблицах но уже с транзакциями)

    Проблема не столько в данных и в их объеме, а в надежности всей схемы, т.е. например можно не делать единую точку отказа и сделать несколько независимых api endpoint, клиенты должны сами переключаться между ними, при ошибках, ну а сам выбор куда подключаться делать случайным.

    Кстати, собственно сбор оперативных данных не обязательно делать в ОДНОЙ физической базе, это могут быть разные БД, а вот последующий анализ уже делать следующим сервисом (так же может быть несколько нод), собирающим данные из разных первичных источников в какой то единый или еще в какой то форме... именно подготовка данных к последующему их использованию и есть вопрос реализации.

    Настоятельно не советую городить зоопарк из разных баз данных типа редис и sql-db.. когда sql база используется без индексов (и тем более без транзакций) на последовательную запись у нее нет конкурентов (ну только что совсем низкоуровневым программированием заняться)
    Ответ написан
    3 комментария
  • Как сделать предпросмотр файлов word, pdf, img, txt в рамке прямо на сайте?

    @rPman
    Изображения и тексты это легко, у них 'простой' формат и реализовать все в браузере будет не сложно, а вот для предпросмотра документов word нужен собственно этот word, так как у него сложный формат (еще сложнее был бы excel).

    p.s. pdf

    Если прямо очень нужно, подними на сервере какой-нибудь совместимый headless инструмент (например libre office, у него наилучшая совместимость с майкрософтовским) и используй его для конвертации документа во что то читаемое в браузере - напрямую изображения или pdf (через печать документа в виртуальный принтер), и то и другое уже не проблема отобразить.
    Ответ написан
    Комментировать
  • Как вставить вкладку на сайт?

    @rPman
    Такой запрет сделан, чтобы защитить пользователей от атаки click jacking, когда атакуемый сайт открывается в прозрачном iframe с авторизацией пользователя, и этого пользователя как то вынуждают кликнуть в определенное место на экране (например рисуют кнопку в этом месте), перемещая iframe таким образом, чтобы пользователь нажимал на какие то определенные кнопки на атакуемом сайте.

    Формально - можно, создав ее копию на своем домене (гуглить например nginx proxy) и подправив на лету скрипты в том месте, где целевой сайт проверяет работу в iframe

    Но! таким образом, естественно, нельзя получить cookies пользователей на этом сайте, потому что домен будет другой и у пользователя на нем будут уже свои куки. А еще атакуемый сайт может понять по статистике, что трафик разных пользователей к нему идет с какого то сервера и это не обычный прокси или vpn... а еще реверсинженеринг чужого кода для того чтобы отвязать его от оригинального домена может оказаться не простым.

    p.s. подмена домена сайта - это тоже свой вид атаки phishing, когда пользователя заманивают на сайт, с привычным внешним видом и отлавливают его попытки ввода в нем пароля, от него тоже могут в коде вставлять соответствующую логику, но как и запрет запуска в iframe ее можно удалить.
    Ответ написан
  • Как сделать фоновую музыку в html на таплинке?

    @rPman
    с примерами, максимально просто: https://www.w3schools.com/html/html5_audio.asp

    p.s. платформы типа vk запрещают (в т.ч. техническими средствами) использование 'своих' мультимедиа данных на чужих платформах, что логично, с какой такой стати они должны тратить деньги на хранение и раздачу мультимедиа бесплатно?

    поэтому сами файлы размещай на своем сервере или каким либо другим способом, подразумевающим это
    Ответ написан
  • Как запустить локальный сервер и получить данные с него?

    @rPman
    Список юзеров получаем с бэкенда. Для этого нужно установить и запустить локально сервер.
    т.е. у тебя УЖЕ есть сервер и тебе его просто запустить, открываешь документацию по этому серверу и работаешь (ее должны были написать те кто делал этот сервер), либо, если документации нет, изучаешь весь код

    в документации по nodejs приведет сразу же пример простейшего веб сервера, ищи что то похожэее, смотри в каких файлах идет вызов и соответственно запускай этот код

    p.s. есть практика размещать все необходимое для запуска приложения в настройках пакета, тогда запуск будет что то типа:
    npm install
    npm build
    npm run-script start

    Т.е. install установит и обновит зависимости проекта, build запустит скрипты подготовки и оптимизации (например webpack), в общем что указано разработчиками, ну и запуск run-script start

    И конечно, если это сделать в каталоге проекта в терминале, то закрытие терминала все закроет автоматически, поэтому это нужно будет прописать в виде сервиса systemd или каким то другим способом, принятом в твоей ОС
    Ответ написан
    Комментировать
  • На каких сайтах не используются куки?

    @rPman
    Куки - это механизм сохранения 'состояния' веб приложения, привязанное к пользователю, между сессиями его (приложения) использования.

    Для собственно авторизации куки не обязательны, ведь это состояние можно передавать и через GET/POST запрос или #anchor ссылки или просто настройка кастомных заголовков (работает только для ajax запросов но не для обычных). Другой вопрос в том, что пользователи привыкли, что сайты сохраняют какое то время авторизацию и не требуют ввода логина и пароля уже для следующего посещения.
    Ответ написан
  • Как правильно документировать разрастающуюся БД?

    @rPman
    Описывай все
    Очень хороший тон писать самодокументируемый код, среды разработки и всякие doxygen для обычных языков программирования, и хоть как то описывай базу данных, комментарии, правильное именование и само собой документация. Недостаточно сказать что вот тут лежат записи таких то объектов, опиши их отношения, количественные и не только ограничения, порядок участия в бизнеспроцессах и т.п.
    Ответ написан
    4 комментария
  • Нормальная ли практика, когда несколько сервисов подключены к одной бд?

    @rPman
    Да, это нормальная практика, если 'клиенты бд' (для веб это бакэнд) работают с ней не в монопольном режиме либо учитывают этот момент и самостоятельно отслеживают коллизии (такие ситуации редко бывают, обычно веб приложения сразу пишут правильно).

    Отличный пример, если у тебя несколько веб серверов, являющиеся разным представлением одних и тех же данных, т.е. один из под форумов может быть блогом или галереей изображений на другом домене, с общей авторизацией (в этом случае для авторизации даже не надо заводить сущностей типа oauth, только шаблоны интерфейса менять). Подводных камней тут практически и нет, даже удобнее, единая админка и для модерации можно использовать готовые механизмы форума.

    Естественно разработка этих проектов не может быть независимой, любые правки должны учитывать сразу все бакэнды и тестировать сразу все. Но очень часто, второй проект подчиненный, и правят в нем только шаблоны интерфейса.
    Ответ написан
    Комментировать
  • Есть последствия редиректа с https на http и обратно?

    @rPman
    Наличие в цепочке http означает что атакующий (к этому уязвима любая free wifi сетка или если пароль подобрать) может направить по следующему редиректу на любой свой домен, или исключить https на последнем звене и подменять содержимое сайта на свое. Само собой провайдеры тоже могут (и занимаются) чем то похожим, как минимум встраивая рекламу (привет ОпСоС-ы).

    Чем опасен http - атакующий (и владелец веб сайта что в данном случае одно и то же) может атаковать локальную сеть пользователя сайта, сейчас это сложнее, в браузеры подкрутили по мелочи, но все есть ряд лазеек (например сделать запрос в админку на роутере, где сохранилась твоя сессия авторизации, в т.ч. к примеру изменять конфигурацию и добавлять свои правила, открывая еще более полный доступ злоумышленника в локальную сеть), так же атакующий может из браузера, в котором открыт http сделать DDOS-илку других сайтов в интернете (особенно если пользователей много), формально это можно сделать и с https но так проще. Ну и само собой, кража личных данных пользователя (пароль) к атакуемому сайту...
    Ответ написан
  • Каково критическое количество HTTP (ajax) запросов на сервер, как его расчитать?

    @rPman
    Осторожно, периодические опросы дают квадратичную нагрузку от количества пользователей.

    Переделывайте на как минимум long pooling, тем более это проще чем городить полноценный websocket.

    И да, не вздумайте в этом месте базу данных дергать, такая архитектура положит не слабый сервер уже с тысячами клиентов. Работайте с оперативной памятью или лучше, сделайте все же сервис, работающий не по принципу cgi (на каждый запрос запускает приложение) а по принципу демона с веб сервером. И уже тут в последствии можно на вебсокеты переделать
    Ответ написан
    Комментировать
  • Как сделано всплывающее окно с моим e-mail адресом Google, который я на этом сервере не оставлял?

    @rPman
    Всплывающее окошко использует iframe, этот тег 'надежно' защищает от доступа к данным со страницы, на которой этот iframe размещен от доступа.. т.е. ни какой информации вытащить из этого фрейма нельзя, но вот сам фрейм может вызывать методы на основной странице, это значит если их там подготовить, код из фрейма может выдавать то что необходимо основной странице. Т.е. страница во фрейме имеет доступ к кукам гугла, а значит авторизации, но вот основная странице нет... с оговорками:

    Есть следующий вид атаки, например, ты заходишь на сайт злоумышленника, поиграть в игру, которая заключается в том что ты должен кликать в определенные области на экране (например быстро прокликать по появляющимся 'случайно' цветным кружкам), сайт злоумышленника в это время подсовывает в iframe атакуемый сайт, разместив его в полупрозрачном iframe (с прозрачностью 0.00000...) ровно в том месте, куда пользователь должен кликнуть мышкой. Пользователь думает что кликает на квадратик, но на самом деле кликает на страницу атакуемого сайта. Основной сайт не знает, что происходит на странице атакуемого, кликнул ли пользователь реально или нет, но может делать об этом предположение, заранее проверив, в каких местах атакуемого сайта находятся нужные атакующему элементы.

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

    Чтобы этого избежать, атакуемый сайт должен проверять, не происходит ли с его положением на странице чего то странного. Хз, делает ли это гугл, надеюсь да.
    Ответ написан
    1 комментарий
  • Как организовать хранение большого количества медиа файлов фото и видео, для сайта?

    @rPman
    До нескольких терабайт, при условии что сайтом очень активно пользуются, сотни мегабайт трафика и т.п. - самое дешевое это использовать свое хранилище, на основе hdd (при большой нужде - ssd), настраивать raid1 или raid5, используя минимально возможное количество дисков на массив (т.е. если 10 дисков то делать либо 2 рейда по 5 дисков либо три по 3 диска, не делать один огромный рейд - особенно если это hdd, он будет медленный). Хранить в виде файлов как они должны отдаваться, метаинформацию - в базе данных.

    Если дисков в своем хранилище больше 20, или если сетевой трафик очень маленький, условно за сутки один-два пользователя смотрят фоточек на десяток другой гб. либо если суммарно хранимый объем превышает десятки-сотни терабайт, то строить свое хранилище становится значительно дороже и лучше идти в облака. Самое популярное это амазон s3, в его формате такие услуги предлгают и российские провайдеры типа селектела или яндекса. Тарификация там двойная - за сетевой трафик (по разному на загрузку и выгрузку) и за хранение от объема.
    Ответ написан
    7 комментариев
  • Как сделать поочередный доступ к сайту?

    @rPman
    В другом ответе все необходимое уже сказано, добавлю

    - организационный, вы пускаете за один и тот же компьютер людей по очереди, определяя следующего человека вручную.
    Развиваем идею:
    * добавить удаленный доступ по rdp/vnc/rustdesk/... чтобы пользователям не требовалось физически подходить к компьютеру
    * добавить автоматическое управление правами у пользователей (для rdp это штатные пользователи ОС, скрипты будут по нескольку строчек хоть на батниках), отбирая права у всех и выдавая право очередному пользователю по списку
    Ответ написан
    Комментировать
  • Как лучше хранить много изображений для веб-приложения?

    @rPman
    Веб приложения максимально оптимизированы при работе с файлами на диске.
    Никакой другой метод не позволит дать такую производительность.

    Поэтому - авторизацию доступа делай на уровне веб сервера (вот пример с нормальным oauth)

    Для удобства обслуживания всего архива, раскидывай файлы по подкаталогам таким образом, чтобы в одном каталоге было не больше десятков тысяч файлов (иначе получение списка файлов будет медленным).

    В качестве имени файла и каталога используй уникальный идентификатор из базы данных (т.е. при загрузке изображения ему отводится запись в базе, и уже после файл перемещается в архив, доступный веб серверу как статичные файлы).

    Тупой пример - числовой идентификатор переводи в hex, дели на группы по 4 символа и создавай соответствующие каталоги: /images/0d4f/3b00/a841/0d88, тут 0d88 это файл, остальные части - каталоги. Идентификатор соответственно 64-битное число 0x0d4f3b00a8410d88

    Недостаток подхода, так как хранилище не входит в транзакционную базу данных, за целостностью приходится следить самому, т.е. если удалили запись в базе, то запись на диске не удалять а перемещать во временное место, пока не завершится транзакция, при успешном завершении файл удаляется окончательно (на самом деле ОС будет его еще держать какое то время доступным, если файл открыт пользователем, т.е. в данном случае веб сервер но нужно еще проверить, не закрывает ли он его каждый раз как отсылает часть), ну а если транзакция сфейлится, то файл нужно будет вернуть назад. Само собой следить за этим местом при запуске сервиса после сбоя.

    p.s. хранить большие бинарные блобы в базе данных можно только при очень большой нужде в транзакциях, и это очень дорого и по памяти и по процессору.
    Ответ написан
    2 комментария
  • Есть ли реальная необходимость использовать Git LFS?

    @rPman
    Мое мнение - абсолютно бесполезен (из-за особенностей реализации и избытка функционала).

    Главная фича git и других систем контроля изменений - это контроль за изменениями, возможность быстро откатиться к нужной версии, мержить версии, переносить изменения из одной ветки в другую и т.п. и все заточено на работу с текстом. большие файлы - это про бинарные или не редактируемые данные. Даже sql дампы таким образом адекватно не будут обработаны (пример - добавлена колонка)

    Ни один адекватный юзкейс не подразумевает все это при использовании именно больших файлов, за исключением может быть только автоматического приведения контента к нужной версии (и это достигается гораздо более легковестными инструментами, например тот же rsync умеет собирать бакап с использованием симлинков от предыдущего бакапа, т.е. в любой момент тебе доступна любая сохраненная версия, с оговорками на чтение, но тут вступают снапшоты файловой системы и все становится очень просто)

    git-lfs работает очень не эффективно, банальный git clone репозитарием из 20-гигабайтовых файлов требует сравнимый объем оперативной памяти, потому что там на любой файл идет diff/patch, что бессмысленно для бинарных файлов в подавляющем большинстве случаев.
    Ответ написан
    Комментировать
  • Какие существуют библиотеки для подключения аудиоплееров?

    @rPman
    Все зависит от плеера, у каждого свои механизмы

    Например у mpv (потомка mplayer) есть возможность управлять им, симулируя нажатия на кнопки (как я помню через stdin пайпом от своего приложения) и используя плейлист через пайп или тот же stdin, формируя его на лету своим приложением

    по нормальному mpv поддерживает скриптовые плагины на lua, есть плагин mpv-network-commands так что любое поведение можно запрограммировать
    Ответ написан
    Комментировать