• Как удалять файлы и папки по расписанию?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    Написать скрипт на любом скриптовом языке.
    с 2007 винды есть встроенная утилитка которая позволяет обрабатывать файлы по маске и дате

    forfiles.exe /p путь_к_папке /s /m *.* /d -7 /c "cmd /c del /q /f @file"

    Можете предварительно выполнить эту команду, чтобы посмотреть список файлов, старше 7 дней:
    forfiles.exe /p путь_к_папке /s /m *.* /d -14 /c "cmd echo @file is too old and will be removed"
    Ответ написан
    Комментировать
  • Есть сервисы или библиотека для склонения слов?

    SilenceOfWinter
    @SilenceOfWinter Куратор тега PHP
    та еще зажигалка...
    https://github.com/wapmorgan/Morphos проверенный временем стафф
    Ответ написан
    Комментировать
  • Как подменить ip адрес?

    @Dimka555
    Ставите tor на свой сервер. И curl --socks5 127.0.0.1 9050
    При необходимости сменить ip - /etc/init.d/tor restart
    Ответ написан
    Комментировать
  • Что такое замыкание?

    @HowardRoark
    Full stack developer
    Мне кажется, самый простой пример замыкания - это счетчик.
    var counter = (function () {
    	var current = 0;
    	return function () {
    		current++;
    		return current;
    	}
    })();
    
    console.log(counter()); // 1
    console.log(counter()); // 2

    В данном случае мы не имеем доступ к переменной current и функция гарантированно возвращает каждый раз уникальное значение.
    Если бы это была простая функция, то переменная, содержащая состояние (current), должна была бы находиться вне функции.
    var current = 0;
    var counter = function () {
    	current++;
    	return current;
    }
    
    console.log(counter()); // 1
    current = 5;
    console.log(counter()); // 6

    А это уже нарушает принцип "черного ящика", т.к. переменной можно присвоить другое значение в любом месте.
    Ответ написан
    4 комментария
  • Как защитить переменную js?

    Sanasol
    @Sanasol Куратор тега JavaScript
    нельзя просто так взять и загуглить ошибку
    Так чтобы это имело смысл - никак.
    Так чтоб просто было - как угодно, берите любой шифр и шифруйте...
    Ответ написан
    Комментировать
  • Как защитить переменную js?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    Если вам нужно защитить данные в javascript коде от постороннего вмешательства, то вам не нужно эти данные размещать в javascript коде.
    Ответ написан
    Комментировать
  • Как использовать smtp.yandex.ru в laravel?

    danleks
    @danleks
    Тоже долго мучался.

    Решил на следующий день коренным образом.

    Выпилил все Mail-настройки из .env

    И вписал в config/mail.php следующее:

    'driver' => env('MAIL_DRIVER', 'smtp'),
        'host' => env('MAIL_HOST', 'smtp.yandex.ru'),
        'port' => env('MAIL_PORT', 587),
        'from' => [
            'address' => 'user@yandex.ru',
            'name' => 'Type What You Want',
        ],
        'encryption' => env('MAIL_ENCRYPTION', 'tls'),
        'username' => env('MAIL_USERNAME', 'user@yandex.ru'),
        'password' => env('MAIL_PASSWORD', 'secretpass'),


    Аналогичны настройки и для отправки с Gmail.
    Ответ написан
    1 комментарий
  • Есть ли модуль пользовательских уведомлений?

    zvermafia
    @zvermafia
    WebDev
    Знаю видео урок: Notifications: Database
    Ответ написан
    Комментировать
  • Как обезопасить сайт работающий с API?

    sayber
    @sayber Куратор тега PHP
    Да, я программирую на PHP и еще асинхронно!
    JWT, ApiDoc и конечно https
    Забыть о сессиях и всякой остальной фигне.

    Конечно должны быть кастомные реквесты, жесткие модели и серьезная валидация данных.
    Ответ написан
    9 комментариев
  • Репозиторий и ActiveRecord, хорошая ли идея возвращать модели?

    AmdY
    @AmdY
    PHP и прочие вебштучки
    Это типичный пример, когда люди не сами доходят до паттернов, а начитываются умных книг и суют свои репозитории и ддд без понятия зачем это нужно.
    Сколько уже статей видел об использовании репозиториев в laravel, все прдлагают куегкт Model::all() и т.д. Плевать, что возвращают всё тот же Eloquent, который пытаются убрать.

    В проектах на symfony даже при наличии doctrine творится такой же ад. То. что люди не умеют делать нормальные репозитории указывает на то, что оно им и не надо было такой абстракции. Для 99% проектов вообще не стоит тащить абстракции вроде репозиториев.
    Ответ написан
    6 комментариев
  • Как правильно организовать обработку данных в экшене контроллера?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    По хорошему валидацию должен делать реквест

    Неа. Request - это просто набор данных.

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

    Вы пытаетесь найти единственное правильно место для проверок. По хорошему проверки должны быть во всех методах, даже в приватных. Что-то не так - бросайте исключение. Эта практика на первый взгляд жуткая, но она вас обезопасит от огромнейшего количества ошибок.

    Опережая ваш вопрос: "это ж сколько дублировать проверки придется?". Да, много, но поверьте, оно стоит того.

    В добавок к этому иногда логика может быть достаточно замысловатой

    Если вы пытаетесь в одной точке захватить множество контекстов - безусловно. Если же будете делать необходимые проверки всюду - эта сложность не возникнет.

    Мне не очень нравится идея выносить куски логики в реквест

    Мысль здравая.

    Соответственно получается неудобная ситуация, когда часть валидации нужно разместить в реквесте, а часть в сервисе.

    Не нарушайте SRP.

    <?php
    
    namespace Vendor\Project\AppBundle\Controller;
    
    use KoKoKo\assert\Assert;
    use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
    use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
    use Symfony\Bundle\FrameworkBundle\Controller\Controller;
    use Symfony\Component\HttpFoundation\JsonResponse;
    use Vendor\Project\Path\Authorization\UserNotFoundException;
    use Vendor\Project\Path\Authorization\InvalidCredentialsException;
    
    class LoginController extends Controller
    {
        /**
         * @Route("/login", name="login")
         * @Method({"POST"})
         * @param Request $request
         * @return JsonResponse
         */
        public function loginAction(Request $request) : JsonResponse
        {
            try {
                $login = $request->request->get('login');
                $pass  = $request->request->get('pass');
    
                Assert::assert($login, 'login')->string()->notEmpty()->match('/^[a-z\d]{3,32}$/i');
                Assert::assert($pass, 'pass')->string()->notEmpty()->lengthBetween(6, 32);
            } catch (\Throwable $exception) {
                return new JsonResponse($exception->getMessage(), JsonResponse::HTTP_BAD_REQUEST);
            }
    
            try {
                $user = $this->get('UserAuthorizator')->authorize($login, $pass);
    
                return new JsonResponse($user->getId());
            } catch (UserNotFoundException $exception) {
                return new JsonResponse('User not found', JsonResponse::HTTP_BAD_REQUEST);
            } catch (InvalidCredentialsException $exception) {
                return new JsonResponse('Invalid login or path', JsonResponse::HTTP_BAD_REQUEST);
            } catch (\Throwable $exception) {
                $this->get('logger')->error($exception->getMessage(), ['exception' => $exception]);
    
                return new JsonResponse('Something went wrnog :((', JsonResponse::HTTP_INTERNAL_SERVER_ERROR);
            }
        }
    }
    Ответ написан
  • Как правильно вести разразработку в PhpStorm?

    sggr
    @sggr
    PHP, Ruby, GO
    Tools->Deployment->Options
    Выставляете галочку на Prompt when overr.....
    Выставляете Automatic Upload в Tools->Deployment
    В итоге после смены ветки/генерации кода/тдтп - изменения отправляются на сервер.

    Но:
    Разработка на удаленном сервере нужна только если Ваш проект сложный и развернуть полноценную рабочую версию тяжело. Например микросервисы. Когда их 20+ поднять полноценное приложение на локальной тачке тяжело, да и порой невозможно, ресурсов не хватит.

    В остальных случаях:
    Никогда не загрязняйте свою хост машину. Используйте vagrant + любой devops софт. Самое простое использовать puphpet. Используйте vcs(git/svn/mercurial), для контроля версий приложения.
    Деплоить можно по разному, тут кто на что горазд, от сборки на локальной тачке и заливке через scp до CI(gitlab, capistrano, jenkins), это тема другого вопроса.

    PS: также, если вы разрабатываете не на винде(лучше сразу отвыкайте), то можно смонтировать nfs директорию, которая будет автоматом подгружать ваши изменения, но уже на уровне операционной системы, а не IDE.

    UPD: d3e6b0993ce2438a8e419ecb9c22b161.png

    UPD2: Под разработкой на сервере я подразумевал девелоперский сервер\контейнер.
    UPD3: Upload External Changes должен выгружать изменения с сервера, но помоему он у меня не заработал по ssh, точно не помню, можете попробовать =)
    Ответ написан
    7 комментариев
  • Что на сайте нужно обязательно кэшировать?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Обязательно - не надо ничего кэшировать.
    Дополнение от dimasmagadan : Не забываем про настройку сервера для того, чтобы браузер клиента мог сам кэшировать страницы.

    В идеале, кэшировать надо данные ВСЕХ функциональных блоков, зависящих от входных параметров.
    К ним относятся:
    1. SQL-запросы и ответы
    2. поиск по любой структуре данных и результат этого поиска
    3. файловая структура, находящаяся по определённому пути
    4. данные, полученные для каждого из блоков представления ("список", "выборка", "статистика" и т.д.)
    5. сформированный шаблонизатором контент на основе GET-параметров

    Всегда кэшируйте первым тот блок, который занимает больше времени при обработке данных и т.д. по нисходящей.
    Первые претенденты на кэширование, как правило: блоки с пунктами 2, 3 и 5.

    Дополнение от Алексей Уколов :
    Кеширование - это большая боль для разработчика, на самом деле. И "не надо кешировать" - это именно с этой точки зрения. Любой кеш усложняет приложение в разы, потому что его нужно инвалидировать, обрабатывать ошибки и т.п. Но часто без него не обойтись, это факт.
    Ответ написан
    7 комментариев
  • Правильно ли я понял, как работает токен?

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Я мимо проходил и, вроде, все верно, кроме:
    С мобильного приложения я отправляю логин и пароль на сервер api.
    Никогда! Слышишь, Карл?! НИКОГДА НЕ ПЕРЕСЫЛАЙ данные авторизации на сервер БЕЗ ПРЕДВАРИТЕЛЬНОГО ХЕШИРОВАНИЯ на стороне клиента серверным ключом.

    1. Данные на клиенте: hash(USER1:PASSWORD:SKEY:RANDOM),
    2. Пересылаю на сервер: ab1e37ab50c61d8c80fb5cb4b1e3122f:RANDOM
    3. Ищу на сервере совпадение:
    ab1e37ab50c61d8c80fb5cb4b1e3122f===hash(USER:PASSWORD:SKEY:RANDOM) и получаю учётку пользователя, если все верно.

    А так, да! Спасибо, Сергей Протько - все довольно четко и верно написано!
    Ответ написан
    42 комментария
  • Правильно ли я понял, как работает токен?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Да. Все верно.

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

    Так же поскольку у нас по сети гуляют по сути креденшелы, важно использовать SSL. Благо сегодня есть lets-encrypt что бы бесплатно получить сертификаты.

    И последнее, что бы обезопасить себя еще, используйте refresh-токены. То есть наш уникальный токен который гуляет в каждом запросе будет иметь ограничение по времени жизни (скажем 5 минут) и для его обновления мы будем использовать refresh-токен. При получении refresh токена клиенту уходит новая пара токен + refresh-токен.

    Таким образом у злоумышленника который перехватил токен пользователя будет окно всего в 5 минут что бы что-то сделать.
    Ответ написан
    13 комментариев
  • Как проверить открытие письма отправленного через mail()?

    fox_12
    @fox_12
    Расставляю биты, управляю заряженными частицами
    Вставить ссылку на картинку, хотя бы даже на пиксель с уникальным токеном, соответствующем данному письму, и отслеживать обращение к нему.
    Ответ написан
  • Почему laravel не может создать таблицу?

    DJZT
    @DJZT
    Laravel - code for you
    Schema::create('books', function (Blueprint $table) {
                $table->increments('id');
                $table->string('title');
                $table->text('description');
                $table->string('author');
                $table->timestamps();
            });


    Метод create. А метод table обращается к существующей таблице.
    P.S. Читайте текст ошибок. Там всё написано
    Ответ написан
    1 комментарий
  • Как правильно организовать push уведомления на сайте?

    Я для пуш сообщений centrifugo использую, кроме нее дополнительно ставить ничего не надо на сервер (ну разве что supervisor). Организация такая: прочитать документацию, сгенерировать конфиг для центрифуги, запустить ее, скачать либу с гитхаба для php сервера и пример для клиента и запилить свое приложение. Если используете ларавел, то вообще все быстро сделаете на родных евентах и бродкастинге сообщений.
    Ответ написан
    1 комментарий