Задать вопрос
  • Безопасны ли такие SQL-запросы?

    blacknightwolf
    @blacknightwolf Автор вопроса
    Immortal_pony, 1. А какой стиль программирования лучше и удобнее для подготавливаемых запросов? ООП или процедурный?
    2. Как подготовить данные, которые будут содержать цифры, буквы, символы?
    $mysqli = new mysqli('localhost', 'my_user', 'my_password', 'world');
    $code = 'DEU'; // это string (s)
    $language = 'Bavarian'; // тоже string
    $official = '$2y$10$.vGA1O9wmRjrwAVXD98HNOgsNpDczlqm3Jq7KnEd1rVAGv3Fykk1a'; // А как быть с хешем пароля?
    $percent = 'username123'; // А как быть с этим? 
    $stmt = $mysqli->prepare("INSERT INTO CountryLanguage VALUES (?, ?, ?, ?)");
    $stmt->bind_param('ss??', $code, $language, $official, $percent);
    $stmt->execute();
    $stmt->close();
    $mysqli->close();

    3. От XSS нужно защищаться так?
    $mysqli = new mysqli('localhost', 'my_user', 'my_password', 'world');
    $code = htmlspecialchars($_POST['text1']);// 123 - int
    $language = htmlspecialchars($_POST['text2']); // abc - string
    $stmt = $mysqli->prepare("INSERT INTO CountryLanguage VALUES (?, ?)");
    $stmt->bind_param('is' $code, $language);
    $stmt->execute();
    $stmt->close();
    $mysqli->close();


    4. А стоит ли использовать mysqli_real_escape_string, addslashes, strip_tags для $_POST['text']? (Перед подготавливаемым запросом)

    P.S Большое спасибо за помощь и ответы :)
  • Безопасны ли такие SQL-запросы?

    blacknightwolf
    @blacknightwolf Автор вопроса
    Immortal_pony, А можно ли использовать обычный SQL-запрос в том случае, если переменная поступает от (int)$_GET, либо известна, но не поступает от пользователя? Например:
    $id = (int)$_GET['id']; 
    $sql = "SELECT id FROM `users` WHERE id='$id'";
    $query = mysqli_query($link, $sql);

    Или так:
    $id = 123; 
    $sql = "SELECT id FROM `users` WHERE id='$id'";
    $query = mysqli_query($link, $sql);

    Или абсолютно все запросы нужно подготавливать?
  • Безопасны ли такие SQL-запросы?

    blacknightwolf
    @blacknightwolf Автор вопроса
    alexalexes, А почему нельзя склеивать строки запросов с параметрами? Из-за повышенной вероятности SQL-инъекции? Или другая причина?
  • Безопасны ли такие SQL-запросы?

    blacknightwolf
    @blacknightwolf Автор вопроса
    Спасибо за ответ. Кажется, придется переписывать весь сайт... Но у меня есть еще несколько вопросов:
    1. А в чем уязвимость запроса, который приведен в вопросе? Все данные, поступающие от пользователя, экранируются. Защита от XSS тоже есть.
    2. Подготавливаемые запросы защищают от SQL-инъекций на 100%? Или они тоже имеют уязвимости?
  • Безопасны ли такие SQL-запросы?

    blacknightwolf
    @blacknightwolf Автор вопроса
    Сергей, PDO? Пока только учусь. Но меня интересует именно тот запрос, который приведен в вопросе. Хотелось бы узнать уязвимости
  • Безопасны ли такие SQL-запросы?

    blacknightwolf
    @blacknightwolf Автор вопроса
    1. Как злоумышленник сможет удалить таблицу? Он ведь не знает ее названия. А если я назову её не `users`, а гораздо сложнее? Вывод ошибок отключаем: error_reporting(0); //чтобы не узнали имя таблицы
    А еще с помощью preg_replace можно удалить фразы из строки: |DROP| |INSERT| |UPDATE| |DELETE| |SELECT|.
    Или все гораздо сложнее?
  • Безопасно ли так хешировать пароли?

    blacknightwolf
    @blacknightwolf Автор вопроса
    Tyranron, Благодарю! Переубедили от использования md5/sha1. Теперь буду использовать Argon2 :) Но меня интересует ещё несколько вопросов:
    1. Нужна ли соль Argon2 для дополнительной безопасности?
    2. Возможно ли подобрать Argon2? Или Argon2-хэш является 100% защитой от взлома/перебора?
  • Безопасно ли так хешировать пароли?

    blacknightwolf
    @blacknightwolf Автор вопроса
    Tyranron, Спасибо. Получается, если к моему примеру добавить соль, то этот хеш будет безопасным?
    Вывод: повторяем хэширование много раз, дабы увеличить время выполнения алгоритма, что замедлит подбор паролей.

    Странно.. Тут многие писали, что вложенность хешей упрощает коллизию. Или это не так?
  • Безопасно ли так хешировать пароли?

    blacknightwolf
    @blacknightwolf Автор вопроса
    kruslan, 1000 GPU? Сколько же денег на все это уйдёт..)) И да, а есть ли какая-то статья, которая показывает на практике коллизию/подбор по словарям? Например такого хеша, который я привёл в примере. Искал, но нашёл только md5.
  • Безопасно ли так хешировать пароли?

    blacknightwolf
    @blacknightwolf Автор вопроса
    Спасибо большое за развёрнутый ответ :).
    1. Хеширование делается для того, чтобы не хранить пароль в чистом виде.
    2. Да, тут оговорился. Имел в виду подбор пароля по словарям.
    3. Тут все странно и сложно.. Для взлома sha1 на данный момент нужно 110 лет:
    23 февраля 2017 года специалисты из Google и CWI объявили о практическом взломе алгоритма, опубликовав 2 PDF-файла с одинаковой контрольной суммой SHA-1. Это потребовало перебора 9*1018 вариантов, что заняло бы 110 лет на 1 GPU. (Википедия)
    То есть теоретически sha1 взломать можно, но на данный момент это невозможно технически. (Слишком много времени) Но через лет 5-15, скорее всего, коллизия будет перебираться гораздо быстрее. Вот если бы кто-то показал пример коллизии или подбора пароля по словарям в случае хеша как в моем примере, или похожем, то цены бы не было ответу))
    Просто даже статьи нормальной на эту тему я пока не нашёл. (Все говорят, хеш легко взломать, но практики пока не увидел. Увидел только на md5, но и то, даже это прокатывает в 30% случаях).
  • Безопасно ли так хешировать пароли?

    blacknightwolf
    @blacknightwolf Автор вопроса
    Про эту функцию я знаю, но меня интересует безопасность данного примера. Просто интересно, реально ли как-то расшифровать/подобрать такой хеш.
  • Как правильно выбрать данные из массива методом SELECT?

    blacknightwolf
    @blacknightwolf Автор вопроса
    Андрей, echo $friendsql отображало только так: string(10) "Тут полное имя пользователя"
    Но функция print_r перед $friendname = $querynameselect помогла. Теперь вопрос решён. Спасибо огромное за помощь и ответы! :)
  • Как правильно выбрать данные из массива методом SELECT?

    blacknightwolf
    @blacknightwolf Автор вопроса
    Андрей, Сделал. Но ничего не понятно. Вот что вылезло:string(10) "Тут полное имя пользователя"
  • Как правильно выбрать данные из массива методом SELECT?

    blacknightwolf
    @blacknightwolf Автор вопроса
    Андрей, Да-да, теперь вопрос решен на 50%.
    $datasql = "SELECT name FROM `users` WHERE id=$data[0]";
    $querynameselect = mysqli_query($connection, $datasql) or die("Ошибка");
    $friendsql = [];
    while($friendsql = mysqli_fetch_row($querynameselect)) {
    $friendname = $querynameselect;
    }
    echo $friendsql[0]; // теперь пишет просто 1 букву имени.

    Теперь замена происходит, НО показывается только первая буква имени.
    Почему так произошло? Заранее спасибо за ответ!
  • Как правильно выбрать данные из массива методом SELECT?

    blacknightwolf
    @blacknightwolf Автор вопроса
    А зачем? Запрос, который я указал в вопросе работает успешно, НО он работает только один раз, то есть 1 друга он выводит. Но 2,3,4 и т.д уже нет. Изначально все было так:
    echo $data[0]; // вывел 1
    //какой-то html-код 
    echo $data[1]; // вывел 2

    Но теперь нужно просто заменить полученные id на имена, а замена происходит только один раз, как я уже описал в вопросе
  • Как правильно выбрать данные из массива методом SELECT?

    blacknightwolf
    @blacknightwolf Автор вопроса
    Александр Шаповал, Для чего меняю? Так мне нужно: 1. Вывести id друзей. (Выполнено) 2. Заменить id на имя юзера. С этим-то и проблема. $data[0] = 123(Id). Потом id заменяю на имя. И так далее. $data[1] = 1234(Id). А вот тут имя уже не заменяется. Хотя массив равный 0 успешно отображается
  • Как правильно вывести данные из бд в массив?

    blacknightwolf
    @blacknightwolf Автор вопроса
    Уже ответили выше. Но за ответ спасибо, он тоже верный)
  • Почему не читает GET-параметр?

    blacknightwolf
    @blacknightwolf Автор вопроса
    Lander, Извиняюсь, в спешке не заметил и допустил глупую ошибку. Да, теперь работает. Благодарю за помощь и ответы!
  • Почему не читает GET-параметр?

    blacknightwolf
    @blacknightwolf Автор вопроса
    Lander, Сделал. Но не помогло. Я сейчас даже код заменил на такой:
    if (isset($_GET['id'])) {
        $id = $_GET['id'];
        echo $id;
    }

    Но $id не отображается все равно. Даже так:
    if (isset($_GET['id'])) {
        $id = $_GET['friends'];
        echo $id;
    }