Задать вопрос
  • Какой алгоритм работы с JWT token?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    При авторизации выдаются сразу оба токена, рабочий и refresh. Refresh-токен сохраняется в базе сервера вместе с идентификатором пользователя, рабочий токен хранить смысла нет.

    Срок жизни записан в самом токене, как одно из полей полезной нагрузки (payload). Прочитать это поле может и сервер и клиент. Сервер в любом случае должен контролировать срок жизни токена, клиент может это делать сам, а может просто реагировать на ответы сервера.

    Каждый запрос к серверу сопровождается рабочим токеном. Если срок жизни рабочего токена истёк, то сервер возвращает сообщение о необходимости обновления токена.

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

    Где и как хранить токены на клиенте - вопрос предпочтений. Можно не хранить вообще, тогда при перезагрузке страницы пользователю придётся авторизоваться заново. Можно сохранять только refresh-токен, выполняя запрос на обновление при запуске приложения / открытии страницы.
    Ответ написан
    4 комментария
  • Как настроить парсинг из html в csv (или sql), без 5xx ошибки сервера?

    @mSnus
    Для начала -- проверить, что именно вызывает ошибку 500 (включить и посмотреть лог php, подробности в нём).

    Скорее всего превышен max execution time, если сервер ваш - можно увеличить, если нет - надо делить исходный файл на куски (300 записей ок, говорите?) и выполнять скрипт по очереди с каждым.

    Ещё, возможно, разбирать html регэкспами будет быстрее, чем строить DOM.
    Ответ написан
    Комментировать
  • Что нужно знать чтобы написать свой http-сервер по типу apache?

    1. Сначала определяемся с требованиями к этому http-серверу, и чем не устраивают существующие решения
    2. Выбираем из какого-нибудь компилируемого, более-менее производительного языка, с поддержкой асинхронности и удобной работой с сетью:
    Erlang, C#, Go, Rust
    Ответ написан
    4 комментария
  • Как автоматизировать настройку Debian 11, Apache2 (+Nginx), Php, Mysql для production web-сервера?

    SignFinder
    @SignFinder
    Wintel\Unix Engineer\DevOps
    Ansible
    Сначала правда надо его изучить и написать рулбук
    Ответ написан
    Комментировать
  • Как спроектировать базу данных?

    В таблице transactions хранить тип транзакции и её id (то есть у вас должно получиться как минимум три колонки id, transaction_type (символьный или цифровой код, как больше нравится), transaction_id). Остальные колонки в зависимости от поставленной задачи. Далее, в зависимости от типа транзакции, делать соответствующий join.
    Ответ написан
    5 комментариев
  • Как в одном SQL запросе вывести идентификаторы клиентов, у которых нет счёта?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT client
    FROM ( SELECT DISTINCT client
           FROM Dep
         UNION ALL
           SELECT client_id
           FROM Contact ) total
    GROUP BY 1
    HAVING COUNT(*) = 1
    Ответ написан
    Комментировать
  • Как спроектировать страницу авторизации с точки зрения паттерна MVC на PHP?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Или же я вообще пишу глупость

    В целом да. Но

    вся эта логика прекрасно будет в index.php лежать?

    - это гораздо большая глупость.
    Ну то есть лежать-то будет, но к MVC уже никакого отношения не будет иметь.

    По пунктам

    Юзер не должен принимать в конструкторе логин и пароль.
    Вот сейчас эта страница отображает мне двух юзеров помимо меня. Их обоих надо создавать с логином и паролем, серьёзно?

    Что такое AuthPage вообще непонятно. Модель, контроллер? По базе проверяет модель, куки пишет контроллер. А здесь какой-то кадавр.

    Перед тем как писать авторизацию "в стиле MVC", надо сначала разобраться, что такое модель, что такое контроллер, и что такое вью.

    Модель - это вся логика приложения.
    Контроллер - это интерфейс для общения модели с браузером. Делает всё, связанное с обработкой НТТР запросов.
    Вью - отображение.

    Как правильно.

    Соответственно в модели должен быть класс User с методом auth(), который принимает логин и пароль и возвращает инстанс класса Юзер.
    В конторе делается экшен: отдельный метод, который
    - проверяет, если был запрос методом ПОСТ, то берет из него логин и пароль,
    - валидирует их, если валидация не прошла, то создает ошибку, которую надо показать юзеру
    - если прошла, то вызывает метод auth() модели User, передавая в него логин и пароль
    - если совпали, то пишет в сессию ид юзера, и делает редирект куда-нибудь
    - если не совпали, то создает ошибку, которую надо показать юзеру
    - вызывает вью с формой для логина и пароля

    Для регистрации делается еще один экшен, который
    - проверяет, если был запрос методом ПОСТ, то берет из него данные для регистрации,
    - валидирует их, если валидация не прошла, то создает ошибку, которую надо показать юзеру
    - если прошла, то то заполняет класс User данными и выполняет метод save() и делает редирект куда-нибудь
    - вызывает вью с формой для регистрации

    Для личного кабинета делается третий экшен, который берет из сессии ид юзера, обращается к методу read() модели User и через View показывает личный кабинет

    Варианты реализации

    Самый простой вариант реализации контроллера - это папочка с отдельными файлами-экшенами. Ничего плохого в такой архитектуре нет, этот этап надо пройти, если раньше так не делали.

    То есть папка user в которой есть, скажем, файл index.php который является экшеном личного кабинета.
    Он проверяет юзера в сессии, и если нету, то перекидывает на auth.php
    в auth.php есть форма и ссылочка на register.php
    Все три файла инклюдят в себя файл user.php из папки model, в котором есть функции auth(), register() и profile()

    Но в более классическом варианта к трем буквам MVC добавляется ещё одна - R, роутер. Специальный сервис, который разбирает адресную строку, и видя, например, что к сайту обратились по адресу /user/register, создаёт экземпляр класса UserController и вызывает его метод register()
    Ответ написан
    4 комментария
  • Как сделать такой абсолютный путь?

    DevMan
    @DevMan
    <img src="/img/image.jpg" > этого достаточно для работы на любом домене с любой схемой.
    если же реально нужно иметь домен в ссылке, то программно вычислять.

    также есть тег base.

    в общем все зависит от потребности.
    Ответ написан
    2 комментария
  • Почему возникают проблемы с кодировкой при добавлении записи в таблицу?

    sergey-gornostaev
    @sergey-gornostaev
    Седой и строгий
    Похоже, что проблема с тем средством, которым вы таблицу просматриваете.
    Ответ написан
    Комментировать
  • Возможно ли создать хорошую игру одному?

    @HellWalk
    Мне 14, и это лето я решил посветить изучению языка c++, в то время , как мои одноклассники курят, и считают это чем-то крутым.

    Молодец, далеко пойдешь.

    Я хочу создавать игры на языке c++

    Хочешь - делай, все просто. Главное начать, а там по ходу разберешься. В любом случае, сколько бы ты не писал планы и концепции на бумаге - в процессе все 10 раз поменяется.

    возможно ли, создать хороший проект одному?

    Можно.

    И вообще, какой уровень знаний нужен для этого?

    Чем сложнее игра - тем больший объем знаний нужен. Для какой-нибудь змейки нужны базовые знания C++. А для создания 3D MMORPG на своем движке понадобится огромный объем знаний.

    P.S. Главное получать от процесса удовольствие. Если будешь делать игру, а мысли только о том, что "поскорее бы релиз и заработать денег" - скорее всего ничего не добьешься.
    Ответ написан
    Комментировать
  • Возможен ли сайт отзывов без сервера на Node (только HTML+CSS+JS)?

    @abberati
    frontend-разработчик
    В современном мире это возможно. Хоть, без бэкенда обойтись не получится, но писать его самому не обязательно. Описанная задача достаточно просто решается с использованием, например, firebase от гугла (или аналогов)
    Ответ написан
    2 комментария
  • Как взламывают бд крупных компаний?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Взламывают точно так же как и мелкие.
    В статье описана обычная SQL инъекция, когда данные подставляются прямо в SQL запрос.

    Я просто сомневаюсь, что valve может нанять таких людей в backend

    Не надо сомневаться.
    Нету никаких "особенных способов взлома".
    А есть такое явление как "эффективные менеджеры". У которых размер премии зависит от того, сколько денег они сэкономили акционерам.

    Если бы там были подготовленные выражения, то и взлома бы не было.
    Но вместо подготовленных выражений в больших компаниях есть эффективные менеджеры. Которые экономят на нормальных программистах, и заказывают разработку в Индии, в штате Бангалор. Где живет какой-нибудь Хамишь Кумар, который родился в касте вычерпывателей говна из сортиров. И вот у него только один шанс не черпать говно всю жизнь - всеми правдами и неправдами научиться программировать, путь даже за еду. Сравниваем с силиконовым программером с запросами $250k в месяц. Экономия налицо!

    На всякий случай напомню, для стопроцентной защиты от инъекций необходимо всегда следовать двум простым правилам:

    1. данные подставляем в запрос только через плейсхолдеры
    2. идентификаторы и ключевые слова подставляем только из белого списка, прописанного в нашем коде.


    Ключевое слово здесь - "всегда". Как только начинаются рассуждения вида "ну эти данные и так безопасные, их защищать не надо", то в этот момент мы добавляем инъекцию к себе на сайт. Следует понимать, что защищаем мы не данные, а запрос. Данные нас вообще не интересуют - какие они, откуда пришли, являются "безопасными" или нет. Важно не то откуда они пришли, а то, куда они идут. В SQL запрос? Используем подготовленные выражения, точка.
    Ответ написан
    1 комментарий
  • Как заменить все вхождения символа на различные значения не прибегая к циклам?

    @dodo512
    $str = '1234145577';
    $mask = '+7(###)###-##-##';
    $i = 0;
    
    $result = preg_replace_callback(
        '/#/',
        function ($m) use ($str, &$i) {
            return $str[$i++] ?? $m[0];
        },
        $mask
    );
    
    echo $result;
    Ответ написан
    2 комментария
  • Занесение массива в функцию, в чем ошибка?

    BorLaze
    @BorLaze
    Java developer
    Смешались в кучу кони, люди... зачем внутри циклы, если для вычисления среднего достаточно
    <?php
    $my = function ($arr)
    {
       return array_sum($arr) / count($arr);
    };
    
    echo $my(array(1, 2, 3, 4));
    Ответ написан
    1 комментарий
  • Как вывести данные из бд, записать их в переменную и вставить в UPDATE?

    samodum
    @samodum
    Какой вопрос - такой и ответ
    Зачем делать две выборки и два SQL-запроса, если всё можно сделать одним SQL-запросом, только нужно правильно составить условие и апдейт.
    И ещё, такие операции обычно делают в рамках транзакции
    Ответ написан
    Комментировать
  • Булевы операции в php?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Читаем документацию:
    Смысл двух разных вариантов для операторов "and" и "or" в том, что они работают с различными приоритетами (смотрите таблицу Приоритет выполнения операторов).

    Открываем таблицу приоритетов, ищем нужные операторы.
    && - 15 строка, = - 19 строка, and - 23 строка.
    Переписываем команды с учётом приоритета:
    $bool = true and false; => ($bool = true) and false;
    $bool = true && false; => $bool = (true && false);
    Ответ написан
    2 комментария
  • Зачем нужны внешние ключи прописанные в структуре БД (MySQL) - они действительно там нужны?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Любая СУБД имеет достаточно мощную систему контроля целостности и непротиворечивости данных. Эта система работает, используя набор правил контроля, описанных в структуре БД, и жёстко следит за тем, чтобы ни одно из правил не было нарушено.

    Внешний ключ - это как раз такое правило. Сформулировано оно так: в данном поле таблицы не может храниться значение, которое не присутствует в той таблице, на которую ссылается внешний ключ (rонечно, в зависимости от конкретного текста ссылки внешнего ключа и самого поля тут возможны варианты - например, в этом поле может храниться не только значение, присутствующее в ссылочной таблице, но и NULL). И, имея такое правило, СУБД ни при каких условиях не позволит его нарушить. Любая попытка вставить запись со значением, которого нет в ссылочной таблице, приведёт к ошибке. Любая попытка изменить существующее значение на такое, которого "там" нет - приведёт к ошибке. То же касается и "второй" стороны, СУБД не позволит изменить значение в ссылочной таблице или удалить его (потому что записи в нашей таблице при этом "потеряют" ссылку) - такая попытка корректировки приведёт к ошибке.
    Ответ написан
    2 комментария
  • Какое регулярное выражение использовать для получения части строки?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Не надо никаких регулярных выражений:

    str.split('=').pop()
    // или
    str.slice(str.indexOf('=') + 1)

    Но, конечно, можно и регулярками:

    str.replace(/[^=]*=/, '')
    // или
    str.match(/(?<==).*/)[0]
    // или
    /[^=]*$/.exec(str).shift()

    А вообще, учитывая, чем является эта строка, и что вы хотите из неё получить:

    new URLSearchParams(str).get('sort')
    Ответ написан
    1 комментарий
  • Как сделать git clone файлов с локального компьютера на сервер?

    delphinpro
    @delphinpro
    frontend developer
    Сделать удаленный репозиторий.
    Назначить его основным (origin) у себя локально.
    Сделать push.

    Разумеется, предварительно настроить коннект к своему серверу по ssh.
    Ответ написан
    4 комментария