• SQL инъекция в UPDATE возможна ли?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Инъекция может быть через любой запрос.
    И защищать тоже надо любые запросы.
    Никогда не надо торговаться, "а можно я не буду защищать именно этот запрос? Ну мааааам!"
    Надо просто всегда следовать простым правилам - любая переменная попадает в запрос только через плейсхолдер

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

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

    То есть сама уязвимость никак не зависит ни от каких второстепенных факторов - типа запроса, передаваемых данных, способов их валидации, твоих знаний SQL. Это сам факт. Можно подставить свой код в запрос? Значит он уязвим. А как конкретно можно нагадить - это отдельная тема.

    Кроме того, любая уязвимость - это всегда ошибки. Если в $id будет пусто, то запрос вызовет ошибку. Если в $id будет слово select то запрос вызовет ошибку. Если будет слово "привет", то запрос вызовет ошибку. Оно тебе надо?

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


    Если вопрос "а можно я не буду защищаться?" вызван ленью, то это тоже решаемо. В принципе, лень - это очень важное качество для программиста. Главное - направить её в нужное русло.

    Если каждый раз писать по три строчки долго
    $sql = "INSERT INTO users SET email = ?, password = ?"; // заменяем на знаки вопроса
    $stmt = $db->prepare($sql); // подготавливаем запрос, получаем stmt
    $stmt->bind_param("ss", $email, $hash); // два знака вопроса - две переменных - две буквы s
    $stmt->execute(); // выполняем запрос

    То надо воспользоваться такой вещью, как программирование. И написать функцию, которая возьмет на себя всю рутинную работу.
    function prepared_query($mysqli, $sql, $params, $types = "")
    {
        $types = $types ?: str_repeat("s", count($params));
        $stmt = $mysqli->prepare($sql);
        $stmt->bind_param($types, ...$params);
        $stmt->execute();
        return $stmt;
    }

    и в итоге предыдущие 4 строчки превратятся в одну:
    prepared_query($db, "INSERT INTO users SET email = ?, password = ?", [$email, $hash]);

    или твой запрос:
    prepared_query($db, "UPDATE table SET test WHERE id = ?", [$id]);

    - просто, быстро, удобно и безопасно
    Ответ написан
    26 комментариев
  • Как это понять?

    theobroma
    @theobroma
    javascript developer (ReactJS)
    1)let arr = str.split(' ');
    Возьмет строку, в данном случае 'aa bb cc aa bb aa', разобьет на части используя пробел как разделитель. В результате получим:
    let arr = ['aa', 'bb', 'cc', ' aa', 'bb', 'aa']
    2) Следующий кусок кода просто произведет подсчет одинаковых частей.
    return arr.reduce((acc, rec, index) => {
        return (typeof acc[rec] !== 'undefined')
          ? { ...acc, [rec]: acc[rec] + 1 }
          : { ...acc, [rec]: 1 }
      }, {});
    Рассмотрим его подробнее. Начнем с аргументов:
    acc – последний результат вызова функции, он же «промежуточный результат».
    rec – текущий элемент массива, элементы перебираются по очереди слева-направо.
    index – номер текущего элемента.

    Что собственно происходит:
    -typeof acc[rec] !== 'undefined' проверит есть ли в объекте 'acc' ключ 'rec'.
    - и если мы уже встречали такой( например когда "aa", но уже во второй раз ), тогда изменить значение этого ключа прибавив 1.{ ...acc, [rec]: acc[rec] + 1 }
    - если же такого ключа еще не было, то создадим его со значением 1, ибо он в первый раз попался{ ...acc, [rec]: 1 }
    Ответ написан
    6 комментариев
  • Как тестировать оптимизацию frontend?

    bingo347
    @bingo347
    Crazy on performance...
    796stwepspdbny_xqrwrrtvoor4.png
    Ответ написан
    Комментировать
  • Правильный подход к разработке на Bitrix?

    udjin123
    @udjin123
    PHP, Golang, React
    Vscode лучше заменить на PhpStorm.
    На локалке все прекрасно разворачивается, в том числе на openserver, только вот окружение надо создавать максимально близкое к боевому. По этому имхо под виндой лучший вариант docker в wsl2. Для докера готовое решение смотрите bitrixdoc.
    Ответ написан
    Комментировать
  • В чём преимущества и недостатки установок через apt и snap?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Нужно понимать принципиальную разницу подхода:

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

    snap - установка большого приложения со всеми зависимостями, которые никак не использует остальной софт на этом же компьютере. Отсюда тратится лишнее место на диске и в оперативной памяти. Зато никаких проблем с зависимостями, плюс snap работает в любых системах и не завязан на конкретный менеджер пакетов и собственно пакетный формат.

    snap по большому счёту часто используют для установки тяжёлых приложений, которые может бысть сложно опакетить, особенно учитывая разнообразие присутствующих в мире дистрибутивов (debian/ubuntu и их клоны) разных версий. В то время как большинство штатного общеиспользуемого софта чаще распространяют в виде пакетов, идущих в составе дистрибутива или отдельно (в том числе в виде разных собранных под разные варианты систем пакетов).
    Ответ написан
    7 комментариев
  • Есть ли у Postman адекватные альтернативы написанные НЕ на electron?

    @Flying
    Не полноценно, конечно, но в какой-то степени в качестве замены можно рассматривать HTTP Client в IDE от JetBrains, к примеру в PHPStorm.
    Ответ написан
    3 комментария
  • AWS: Как посчитать?

    Sanasol
    @Sanasol
    нельзя просто так взять и загуглить ошибку
    Это стоит 20-30$ в год, но никак не 100.

    https://poiskvps.ru/index.php?search_hdd_min=15&se...

    Тут например есть около 2$ в месяц https://firstvds.ru/

    Да даже DigitalOcean дешевле выйдет за 5$(6$ с НДС) - И на DO есть и аппы, и просто сервера. Остальное для тех кто с консолью умеет обращаться.

    s3 website

    это вообще про статичные сайты

    Нет смысла влезать в амазон, в любом случае это в разы дороже чем обычная впска где угодно, плюс если с ногами заходить в AWS s3/cloudfront/rds то выйдет еще в несколько раз дороже.
    Ответ написан
    Комментировать
  • Что будет если в лок сети окажутся два пк с разными ip, разными mac адресами, но с одинаковыми именами?

    CityCat4
    @CityCat4
    //COPY01 EXEC PGM=IEBGENER
    Именами чего, простите?
    С какими осями, простите?

    Есть сто тыщ разных областей, где используется "имя". В DNS - имя. В "сети Windows" - имя...
    Ответ написан
    Комментировать
  • Как отключить сетевую карту в линукс и вообще нужна ли она?

    CityCat4
    @CityCat4
    //COPY01 EXEC PGM=IEBGENER
    Ну... теоретически можно пересобрать ядро, исключив из него дрова на карту и запретив подгрузку дров модулем. НО зачем?
    Ответ написан
    Комментировать
  • Как добавить кнопку скачать у тега video html5?

    anatoly_kulikov
    @anatoly_kulikov
    Помог ответ? Отметь решением!
    Таки вы не поверите - в одном контейнере обычную гиперссылку с атрибутом download и спозиционировать в пространстве вплоть до получения удовольствия.
    Ответ написан
    Комментировать
  • Как организовать масштабирование/отказоустойчивость интернет-магазина?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    smilingcheater всё правильно написал. Дабвлю лишь, что нужно анализировать бутылочные горлышки и исправлять узкие места в первую очередь.
    Разбирайтесь с проблемами детально. Что значит "nginx твалится"? Годами работает и ничего с ним не происходит. Выясняйте что произошло, если такое поторяется, то нужно разбираться, а не надеяться, что кто-то даст универасльный простой, но концептуальный совет, который победит все возможные проблемы наперед.
    Правила тут простые: находим узкое место и расширяем его пока общая производительность в часы пик не будет удовлетворительной.
    Надальте сохранение логов, протоколируйте нагрузки, помониторьте базу. Если проблема извне, то попробуйте подобрать хостинг понадёжнее, сменить OVZ на KVM, разнести БД и бэк на разные инстансы, прикрутите балансировщик,
    Если где-то скорость не принципиальна и можно что-то отложить, добавляйте очередь.
    Ответ написан
    3 комментария
  • Почему Prettier при автосохранении ставит точку с запятой, когда автодобавление semi выключено?

    WblCHA
    @WblCHA
    Потому что ненадо использовать питон стайл в жсе.)

    А если по делу, то темплейт стринг (``) используются не только в виде строк, но и как аргументы функции. Иными словами из-за такое действие преттиера предотвращает вот эту ситуацию:
    console.log()
    `${123}dsa`
    // =
    console.log()`${123}dsa`

    То есть сначала выполнится функция console.log, которая в свою очередь вернёт андефайнд, а далее андефайнд будет использован как функция, что приведёт к:
    Uncaught TypeError: console.log() is not a function


    Следовательно такая запись:
    console.log()
    ;`${123}dsa`
    будет идентична такой:
    console.log();
    `${123}dsa`;
    и никакой ошибки не будет.
    Ответ написан
    2 комментария
  • Как получить значение по ключу при помощи URLSearchParams?

    0xD34F
    @0xD34F Куратор тега JavaScript
    В переданной строке не только параметры - соответственно, разобрана она была неправильно.

    Используйте URL вместо URLSearchParams:

    const url = new URL('https://qna.habr.com/?test=123&frukt=yabloko');
    console.log(url.searchParams.get('test'));

    Или вырезайте из строки лишнее:

    const str = 'https://qna.habr.com/?test=123&frukt=yabloko';
    const usp = new URLSearchParams(str.replace(/^[^?]*\?/, '')); // или str.split('?').pop()
    console.log(usp.get('test'));
    Ответ написан
    1 комментарий
  • Какой процессор выбрать из AMD Ryzen?

    @Tabletko
    никого не трогаю, починяю примус
    R5 3600. Про разгон забудьте
    Ответ написан
    24 комментария
  • Minecraft-сервер из кластера ПК. Можно так сделать?

    saboteur_kiev
    @saboteur_kiev Куратор тега Компьютерные сети
    software engineer
    1. Можешь сказать кластер чего ты уже делал, чтобы понять понимаешь ли ты в принципе что такое кластер и как он настраивается/работает?

    2. Кластера делаются для софта, которое само по себе умеет работать в кластере.
    Майнкрафт этого делать не умеет, его кластеризовать нельзя, без серьезного переписывания игрового движка.
    Ответ написан
    2 комментария
  • Linux для DevOps, где учить, сколько брать?

    CityCat4
    @CityCat4
    //COPY01 EXEC PGM=IEBGENER
    надо знать джун девопсу

    кому-кому? Это что еще за розовый слон?

    "Где баобабы вышли на склон
    Жил на поляне розовый слон..." (С) Учили в школе на пении

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

    "И в зоопарке пасмурным днем
    Стал он обычным серым слоном..." (С)

    Где тут джун? Кто тут пустит джуна? Джун может быть бойцом у девопса и зваться он будет каким-нибудь помошником админа.
    Ответ написан
    Комментировать
  • Почему автоматически не срабатывает submit?

    SilenceOfWinter
    @SilenceOfWinter
    та еще зажигалка...
    return перед submit это заявка на победу, bind давно не применяется. нужно биндить форму/поля по событию change(onChange) и/или submit
    Ответ написан
    3 комментария
  • Как выбрать все элементы которое находится над другим элементом с помощью CSS?

    fallus
    @fallus
    Никак нельзя выбрать предыдущих в CSS.

    Можно зашаманить так, всё же меняя их местами, но визуально они будут в том же положении:
    <div>
      <input type="text" id="test">
      <label for="test">Text</label>
    </div>


    div{
      display: flex;
      flex-direction: column;
    }
    label{ order: 1 }
    input{ order: 2 }
    input:focus + label{ background: red }
    Ответ написан
    Комментировать
  • Делать ли сайт-визитку на React или html?

    approximate_solution
    @approximate_solution
    JS Developer. Angular\React\Vue\Ember
    Для начала советую понять смысл такого инструмента как реакт, и какие цели он решает. Что бы не писать глупости.

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

    Сейчас же в попытке дойти от точки А до точки Б, вы в 5-10 раз усложняете себе путь разработки и дальнейшей поддержки такого сайта, минуя чертоги разума.
    Ответ написан
    8 комментариев
  • Хостинг следит за действиями в ЛК. Нормально ли это?

    DevMan
    @DevMan
    у вас глобальное непонимание и корявенький пример.
    вы покупаете ресурсы. вот если в эти ресурсы навтыкают свои трекеры - будет повод для возмущения.
    а ЛК хостера - его собственность.

    на вашем же примере: вы арендовали офис в крупном офис-центре и удивляетесь, что вас видно на парковке и в холле.
    Ответ написан
    Комментировать