• XSS в обход sprintf (Задание из CTF, никакой чернухи)?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Не защитит
    Ответ написан
  • Может ли меня кинуть работодатель?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Но у меня появились вопросы, а где гарантия что меня не кинут на зарплату.

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

    Так как по договору вы работать не можете, всё строится на доверии.
    Ответ написан
    Комментировать
  • Когда стоит дублировать код?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    DRY - во многих ситуациях является антипаттерном. Легче всего его обнаружить по следующему признаку: объеденив несколько компонент с общей функциональностью вы разделяете логику в этой общей функциональности. Например вы задали понятие Транспорт, и отнаследовались от него на Авто и Мотоциклы, при этом управляете поведением количества колес в Транспорте.

    То, что вам с вероятностью 146% поможет - старый добрый SOLID.

    Когда стоит дублировать код?

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

    Вопрос, а надо ли делать унификацию на клиентской части?
    Или все же будет лучше каждый компонент уникальный и изолированный?

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

    Как определить какой функционал стоит унифицировать, обобщать, а какой изолировать и продублировать?

    Унифицировать стоит шаблоны разработки и типовые реализации.
    Обобщать особо не пытайтесь, не выйдет, чему универсальней решение вы попытаетесь сделать, тем более сложным и не практичным оно будет в частности.
    На счет дублирования - дублируйте каждый раз, когда понимаете, что правки могут прилетать независимо для каждого дубликата.
    Ответ написан
    Комментировать
  • О чем может говорить то что в компании не могут прижиться нанятые сеньеры/лиды?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Большая текучка инженеров - это не маячок, скорее прожектор с сиреной и огнеметами, что надо бежать.
    Вероятнее всего проблема в менеджменте, либо несоответствии вакансии и реальности.

    Что касается старожилов - стоит понимать один важный нюанс: если у вас проектов не много, до синьора дорасти с джуна крайне затруднительно. Я сейчас не про лычку, а про набор опыта. Грубо говоря при поиске работы некоторые из них могут обнаружить, что на деле они мидлы, или мидловатые джуны, увы такое не редкость.
    Ответ написан
    Комментировать
  • Какие есть варианты повышения для вебмастера?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Есть замечательная фраза на этот счет: если кобыла сдохла - слезь.
    Ищите другую. Даже если вы запросите слишком высокий размер оплаты, вам скажут тот, который готовы платить.
    Ответ написан
    Комментировать
  • Можно ли реализовать "умный" поиск по БД?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Elasticsearch с морфологией вам в помощь.
    Ответ написан
    1 комментарий
  • Нужно ли фильтровать глобальные переменные в PHP?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    нужно ли тут проверять пустые ли переменные???

    Этот подход считается довольно геморным, но он колоссально экономит время при отладке. Так что да, это стоит делать.

    Что касается глобальных переменных - лучше их не использовать.
    Ответ написан
    4 комментария
  • Какие есть многопользовательские БД или как правильно работать с MySQL?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Вопрос из серии: "я что-то нажала и все пропало, что делать?". Без инспекции этих сложных скриптов у вас ничего не выйдет.
    Если я правильно понимаю, у вас проблема с конкурентным доступом к одним и тем же данным.
    В принципе есть как минимум 2 относительно простых решения:

    1. Контроль за счет блокировок. Грубо говоря 1ый скрипт перед началом работы с записью N "блокирует ее", записав в memcached / redis / или через GET_LOCK этот идентификатор, если получилось - продолжает выполнение, если не получилось - пытается заблокировать, либо берется за следующую запись.

    2. Решение более специфическое, менее надежное, но более быстрое. Явно указать для первого скрипта: ты работаешь только с парными записями, а второму - с не парными.
    Ответ написан
    Комментировать
  • Отказоустойчивые проверки в PHP?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    но мы исходим из того что слой приложения ничего не знает о слое валидации, а значит.... любой внутренний сервис может нарушить инвариант при передаче неудовлетворительных параметров.

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

    $data = '';
    if(null !== $data){
       $this->findUserByName($data);
    }
    
    if(false === empty($data)) {
          $this->findUserByName($data);
    }

    Если я правильно понял ваш пример, в обоих случаях $data может быть, как null, так и пустой строкой и еще не пустой строкой. В этом случае достаточно
    if (\is_string($userName) && \strlen($userName) > 0) {
          $this->findUserByName($userName);
    }


    public static notEmptyString(string $str) {
     $str = htmlspecialchars(trim($str));
     return false === empty($str) && '-1' !== $str && "0" !== $str && 
    }
    ...
    if(true === WebmozartTrueAssert::notEmptyString($data)){
    // do stuff
    }

    Очень плохо.
    1. Не используйте статику, она ведет к бесконтрольной связности проекта, что потом очень дорого обходится.
    2. Название notEmptyString не соответствует внутренней логике. Вы меняете строку и уже потом выполняете проверки. Если вам явно надо убрать теги и тримнуть переменную - выполняйте это явно сразу после ее первого получения, в контроллере например. Уже потом делает ваши проверки.
    3. Используйте type hinting на возвращаемый результат.
    4. Не стоит делать строгое сравнение с bool, если метод, или функция и так возвращает только bool

    final class NicknameCompound extends Compound {
        protected function getConstraints(array $options): array {
            return [
                new Sequentially(
                    [
                        new NonEmptyStringCompound(),
                        new Length(['min' => UserNickname::LENGTH_MIN, 'max' => UserNickname::LENGTH_MAX]),
                        new Regex(
                            [
                                'pattern' => '/[\w]+/',
                                'message' => 'required.alphanumeric.values',
                            ]
                        ),
                    ]
                ),
            ];
        }
    }


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

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Запросы делались по одному, без оборачивания в транзакцию (насколько я понимаю, если запрос один - то и транзакция бесполезна, независимо от кол-ва строк?).

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

    Кроме этого, batch-запросы с auto increment имеют намного меньшее max время вставки: 1,5 сек против 11,4 (да, 11 секунд на вставку 20 строк).

    Верно, это вполне ожидаемый результат.

    правильно ли я решаю эту проблему и действительно ли суррогатный ключ в таких ситуациях даёт прирост скорости?

    Не совсем. Индекс не ускоряет вставку, что обычный, что комплексный, он ускоряет поиск. Чем меньше индекс - тем быстрее он рассчитается.
    Очень похоже на то, что у вас проблема несколько иного характера. Индекс хранится в ОЗУ, тормоза на вставке вероятно у вас за счет того, что индекс не влазит в буфер движка. Это значит, что при вставке БД занимается вытеснением из буфера одних индексов другими, а это уже работа с файловой системой, что очень медленно.
    В таких ситуациях стоит двигаться в сторону уменьшения размера самого индекса.
    Ответ написан
    4 комментария
  • Куда поместить логику проверки данных перед записью?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Контроль доступа - по возможности выноси в контроллер, с помощью Voters например.
    Валидацию данных - рекомендую выполнять в каждом публичном и защищенном методе. Да, это вроде как гемор, но такой подход экономит время коллосально на отладке. Непосредственно в Entity валидация в сеттерах.
    https://github.com/index0h/php-conventions
    Ответ написан
    Комментировать
  • Возможно ли стать middle/senior без работы?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Возможно ли стать middle/senior без работы?

    Устроиться - возможно. Например вы в компании единственный инженер, можете быть хоть СТО.
    Обладать такой квалификацией - нет.

    без опыта работы но с большими знаниями и проектами можно стать мидлом/сениором?

    Это оксюморон.

    Знаете вы о людях которые учились не в компаниях а самостоятельно и приходили туда уже мидлами/сениорами?

    Мидлами в общем смысле - нет.
    Мидлами, в смысле "более квалифицированными, чем другие сотрудники" - да.
    Ответ написан
    Комментировать
  • Зачем нужны дженерики, если можно проще?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Зачем нужны дженерики, если можно проще?

    дженерики тут ни при чем.

    По сути вы пытаетесь передать в print1 (в заккоментированном коде) срез другого типа. Да, тип элементов среза отвечает вашему интерфейсу intf, но сам срез нет. Следующий вызов вполне валиден, но с типам i1 и i2 вы такого не провернете.
    func main() {
      print1([]intf{nil, nil})
    }
    Ответ написан
    2 комментария
  • Зачем нужны внешние ключи прописанные в структуре БД (MySQL) - они действительно там нужны?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Смысл в том, что создать запись, или изменить ее ссылаясь на не существующий внешний ключ у вас не получится, если проверка внешних ключей не отключена. Грубо говоря, это способ сохранить консистентность данных.

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

    В большинстве случаев FK не нужны, от слова совсем.
    Ответ написан
    4 комментария
  • Как понять что сайт быстрый?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Если вы под скоростью считаете скорость доставки контента - чем "ближе" к вам сервер и шире канал - тем быстрее.

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

    Скорость фронта так же зависит от задач и способа решения.
    Ответ написан
    Комментировать
  • Хорош ли язык Go в backend для новичка?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    В Go очень низкий порог вхождения, так что да, для новичка вполне норм.
    Ответ написан
    Комментировать
  • Как в Doctrine выполнить запрос UPDATE JOIN?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Используйте raw sql и не мучайтесь.
    Ответ написан
    Комментировать
  • Способы блокировки программ на фрилансе?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Поэтапная предоплата
    Ответ написан
    Комментировать
  • Как подключиться один раз к базе?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    Можно, для воркеров подключения могут жить довольно долго. Правда при длительном простое возможен разрыв соединения, так что перед обработкой данных стоит проверять соединение, живое ли оно.
    Ответ написан
  • Могут ли взломать Linux сервер?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    На счет ssh и nginx: лучше открывать на публичном ip nginx, а ssh - на приватном.
    Ответ написан