• 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 комментариев
  • Соглашаться ли получать меньше на испытательном сроке?

    fdroid
    @fdroid
    press any key
    Нет.

    PS Предложите взамен работать на 30% меньше, тогда справедливо будет.
    Ответ написан
    9 комментариев
  • На чем лучше писать аналог Aliexpress?

    solotony
    @solotony
    покоряю пик Балмера
    >>На чем посоветуете написать?

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

    DevMan
    @DevMan
    с такой постановкой вопроса - лучше вообще не писать.
    и вопрос, если уж стоит, должен быть: не на чем, а как.
    Ответ написан
    7 комментариев
  • Фильтрация данных?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Ты как и все пхпшники путаешь валидацию и форматирование данных.

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

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

    Про кэширование вообще забудь, это ты наслушался дуремаров-теоретиков, которые сайт у мамки на ноутбуке видели два раза в жизни.
    Ответ написан
    7 комментариев
  • Как сделать Detached GOST R 34.10 CMS подпись на Node.js?

    @dibrovsd
    У меня работает вот так. Извлеките только ключ из контейнера
    # Контейнер файла с подписью p7m
    openssl cms -sign -inkey ~/certs/private_2018.key -signer ~/certs/sphere.pem -engine gost -binary -outform DER -in file3.pdf -out file3.p7m
    openssl cms -verify -binary -CAfile ~/certs/CA.cer -in file3.p7m -inform DER

    Вот тут еще краткая инструкция как добавить поддержку ГОСТ к OpenSSL.
    Думаю, можно сделать вызов команды консольной из node и считывание результата.

    Вот еще черновые наброски инструкции, которую я вел, пока все это настраивал.

    1) Добавление поддержки алгоритмов в openSSL
    
    1.1) В версии до 1.0 ее просто нет (тут нужно ставить платную версию от КриптоПро) или компилировать вручную из исходников новую версию.
    Это я не делал, поэтому пропускаю
    
    1.2) OpenSSL версии 1.0 (1.1 по другому)
    gost engine входит в операционную систему уже. Чтоб подключить engine, нужно
    
    nano /etc/ssl/openssl.cnf
    
    сразу до секции [ new_oids ]
    вписать
    "openssl_conf=openssl_def"
    
    и в самом низу файла
    
    [openssl_def]
    engines = engine_section
    
    # Engine scetion
    [engine_section]
    gost = gost_section
    
    # Engine gost section
    [gost_section]
    engine_id = gost
    dynamic_path = /usr/lib/x86_64-linux-gnu/openssl-1.0.2/engines/libgost.so
    default_algorithms = ALL
    
    Возможно, libgost.so engine окажется немного не там где у меня
    
    1.3) OpenSSL версии 1.1
    Было принято решение убрать из ядра поддержку gost и теперь она на github-е
    Нужно ее скачать и выполнить инструкции по установке.
    В debian нужно поставить вот эти компиляторы и заголовки к libssl
    apt-get install libssl-dev make cmake
    https://github.com/gost-engine/engine/blob/master/INSTALL.md
    Тут по инструкции все просто и оно рабочее.
    Тут же есть и как правильно модифицировать конфиг openssl
    
    2) Где достать всю цепочку сертификатов (мне для версии 1.1 этого не потребовалось почему-то)
    После установки КриптоПро и сертификата с
    https://ca.kontur.ru/about/certificates
    Они выданы неким "Головным удостоверяющим центром". Этот сертификат появляется в системе после установки КриптоПро
    и их можно экспортировать в файлы уже
    
    3) Как вытащить приватный ключ из контейнера КриптоПро вы уже знаете.
    https://habrahabr.ru/post/275039/
    компилировать и ставить Borland C++ не обязательно (там можно скачать уже готовый файл exe под win)
    
    4) Сертификат (публичную часть ключа вы можете прислать довольно просто)
    Итак, у нас есть приватная и публичная часть и CA (это цепочка сертификатов до корня). Можно не мучатся и просто закинуть сертификат Контур-а в доверенные в linux и забыть о нем (но мне для 1.1 это не понадобилось)
    
    4.1) Перегнать в форму pem
    openssl x509 -inform der -in sphere.cer -out sphere.pem
    openssl pkcs12 -in p12.pfx -nocerts -out private.key
    openssl pkcs12 -info -engine gost -nodes -in sphere.pfx
    
    openssl pkcs12 -info -engine gost -nodes -in sphere.pfx -password pass:Dsgdfh46yu56hsgdfgdgh
    
    openssl pkcs12 -nocerts -out PushKey.pem -in p12.pfx -nodes -password pass:Dsgdfh46yu56hsgdfgdgh
    openssl pkcs12 -nocerts -out PushKey.pem -in sphere.pfx -nodes -password pass:Dsgdfh46yu56hsgdfgdgh
    
    5) Шифрование и расшифровка
    openssl smime -encrypt -engine gost -gost89 -in test.txt -out test.txt.enc sphere.pem
    openssl smime -decrypt -engine gost -gost89 -in test1.PDF -inform=DER -out test1_dec.pdf -inkey /home/www/certs/private_2018.key
    
    6) Подпись и ее валидация
    openssl cms -sign -inkey ~/certs/private_2018.key -CAfile ~/certs/CA.cer -signer ~/certs/sphere.pem -engine gost -binary -in file3.pdf -out file3.pdf.sign
    openssl cms -verify -CAfile ~/certs/CA.cer -signer ~/certs/sphere.cer -engine gost -binary -content file3.pdf -in file3.pdf.sign
    
    6.1) Контейнер файла с подписью p7m
    openssl cms -sign -inkey ~/certs/private_2018.key -CAfile ~/certs/CA.cer -signer ~/certs/sphere.pem -engine gost -binary -stream -outform DER -nodetach -in file3.pdf -out file3.p7m
    openssl cms -verify -binary -CAfile ~/certs/CA.cer -in file3.p7m -inform DER
    
    Есть вариации на тему в какой форме подпись или шифрованный файл. Это решается за счет параметра
    -inform=DER (бинарная форма)
    -outform der (для отсоединенной формы)
    
    Ссылки по теме:
    http://big-town.narod.ru/openssl.html  (основная, которая помогла)
    https://habrahabr.ru/post/275039/
    
    Второстепенные:
    https://stackoverflow.com/questions/12790572/openssl-unable-to-get-local-issuer-certificate
    https://www.altlinux.org/ГОСТ_в_OpenSSL
    https://toster.ru/q/28353
    https://kirill-zak.ru/2015/08/13/298
    https://gist.github.com/aamalev/920f1dff286222ef73d7
    http://sysadmins.ru/topic478444.html
    http://www.ssl.ua/news/most-common-openssl-commands/
    http://soft.lissi.ru/ls_product/skzi/OpenSSL/
    Ответ написан
    Комментировать
  • Как сделать пред показ сайта на android?

    gedev
    @gedev
    сисадмин-энтузиаст
    Альтернативный простой как палка путь:
    1. Запускаете веб-сервер (через npm можно поставить пакет http-server) на 0.0.0.0:8080 (8080 порт для примера, можно взять любой свободный). В случае с http-server он сам запустится там где надо.
    2. Со смартфона подключаетесь к той же Wi-Fi сети, в которой находится компьютер и заходите по локальному IP. IP зависит от вашей локальной сети. Например, так: 192.168.3.11:8080
    3. Вы великолепны
    Ответ написан
    Комментировать
  • Как в цикле в последнем значении не ставить /?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    В данном случае проще не использовать цикл.
    <?php echo implode('<b>/</b>', array_column($product['qt'], 'name')); ?>
    Ответ написан
    1 комментарий
  • Можете подсказать профессию?

    vabka
    @vabka
    Токсичный шарпист
    Посмотрите, что там в требованиях к кандидату в neurolink - там вроде железячники нужны, C++, и ML.
    А факультет - вам видимо нужна нейроинформатика.
    Ответ написан
    4 комментария
  • Почему SMTP не отправляет русские символы на почту?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Три простых шага для решения данной проблемы:

    1. Посмотреть на календарь и уточнить, какой сейчас век на дворе.
    2. Аккуратно выделить этот код, и нажать кнопочку Del
    3. Скачать phpmailer
    4. Забыть все эти кустарные ковыряния как страшный сон.

    В итоге код должен получиться примерно таким:

    require 'PHPMailerAutoload.php';
    $mail = new PHPMailer;
    $mail->setFrom('from@example.com', 'First Last');
    $mail->addAddress('whoto@example.com', 'John Doe');
    $mail->Subject = 'PHPMailer file sender';
    $mail->msgHTML("My message body");
    $mail->send();

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

    @Kostyan4ik
    В документации
    Ответ написан
    Комментировать
  • Альтернатива sudo/su для Windows?

    @azarij
    В меру опытный никто
    Комментировать
  • Composer autoload на PHP?

    DevMan
    @DevMan
    тыжпрограммист – получи список нужных файлов автоматом.
    Ответ написан
    Комментировать
  • Сервисы ОСАГО с API?

    @sadCake
    Заключать договор со страховыми, чтобы работать как с партнерами. У них есть свои api для всяких таких штук.
    Собираешь всю необходимую для страховой инфу, кидаешь во все СК, ждешь пока они обработают, потом выдаешь пользователю полученные варианты, ну и дальше, в зависимости от выбора пользователя, работаешь с конкретной СК
    Ответ написан
    1 комментарий
  • Как сделать мониторинг сервера GMOD на php?

    Awilum
    @Awilum
    Частный разработчик, ментор и преподаватель курсов
    это наверное надо вот сюда писать такое https://freelance.habr.com/tasks
    Ответ написан
    Комментировать
  • Нужен ли ИП для игрового проекта?

    Тебя в принципе оштрафовать нужно, ты занимаешься пиратством, ты хочешь заниматься этим законно?
    Ответ написан
    4 комментария
  • Как вывести данные из БД в массив (PHP)?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Понял как вывести данные с БД
    И как? Не вижу кода который у вас что-то вообще запрашивает из бд. БТВ данные из бд приходят обычно в виде массива (есть нюансы, но в целом так).
    Ответ написан
    4 комментария
  • Какой язык нужен для написания серверной части?

    dima9595
    @dima9595
    Junior PHP
    1. При чём тут тег HTML?
    2. Подойдёт любой язык программирования который вы знаете. Хоть на ассемблере пишите.
    Ответ написан
    Комментировать
  • IT компании + судимость?

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

    @Exzyggwp
    Помоему вам нужно воспользоваться INNER JOIN

    $sql = $db->super_query( "SELECT SUM(news_read) as news_read FROM " . PREFIX . "_post_extras
    INNER JOIN " . PREFIX . "_dle_posts ON " . PREFIX . "_dle_posts.category = " . PREFIX . "_post_extras
    WHERE category='1'" );
    Ответ написан
    Комментировать