Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.50/18: Рейтинг темы: голосов - 18, средняя оценка - 4.50
8 / 8 / 5
Регистрация: 05.04.2012
Сообщений: 165
1
MySQL

Защита от SQL инъекций-PDO

07.11.2017, 20:21. Показов 3417. Ответов 20
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Прочитал,что для защиты от инъекций нужно использовать PDO. Если переменная является параметром в запросе,то всё нормально,

PHP
1
2
3
4
$search=$_POST['search'];
$result=$pdo->prepare("SELECT `email` FROM `zayvki` WHERE `email`=?") or die ("<script type=\"text/javascript\">alert(\"Ошибка базы данных. Обратитесь к администратору\")</script>");
$result->execute(array($search));
while($array=$result->fetch(PDO::FETCH_LAZY))

но если названием таблицы,то всё,ничего не работает. Вроде как и не должно работать с названиями таблиц,но как тогда их защитить от инъекций?
PHP
1
2
$page=$_GET['page']; 
$result=$baza->query("SELECT `title` FROM `$page`");
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.11.2017, 20:21
Ответы с готовыми решениями:

Защита от sql инъекций
Есть сайт, на его странице через метод GET передаётся параметр переменной id записи в таблице....

Защита от SQL-инъекций
Здравствуйте, для защита от SQL-инъекций я использовал нижеуказанную функцию для значений...

защита от sql инъекций
Добрый день! Подскажите пожалуйста, от sql инъекций спасает ли mysql_real_escape_string? есть ли...

Защита от SQL инъекций
Всем добрый день. Я второй день изучаю php в связи с тем, что мне нужно срочно написать скрипт...

20
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
07.11.2017, 21:21 2
Цитата Сообщение от Burnoutman Посмотреть сообщение
как тогда их защитить от инъекций?
белый список
1
8 / 8 / 5
Регистрация: 05.04.2012
Сообщений: 165
07.11.2017, 22:08  [ТС] 3
Цитата Сообщение от Jewbacabra Посмотреть сообщение
белый список
А что должно быть в белом списке? Можно подробнее?
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
07.11.2017, 22:30 4
Цитата Сообщение от Burnoutman Посмотреть сообщение
А что должно быть в белом списке
имена таблиц, который могут быть использованы в запросе
1
8 / 8 / 5
Регистрация: 05.04.2012
Сообщений: 165
08.11.2017, 19:18  [ТС] 5
Цитата Сообщение от Jewbacabra Посмотреть сообщение
имена таблиц, который могут быть использованы в запросе
А могу ли я хранить имена таблиц в БД и когда нужно доставать их, помещать в массив, потом с помощью in_array проверят наличие нужного мне значения и если оно есть, то выполнять подключение к базе? Больше ничего не нужно экранировать или ещё чего,просто сравнивать названия и всё?
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
08.11.2017, 21:24 6
Цитата Сообщение от Burnoutman Посмотреть сообщение
А могу ли я хранить имена таблиц в БД и когда нужно доставать их, помещать в массив
Можешь, но зачем делать лишний запрос?
Цитата Сообщение от Burnoutman Посмотреть сообщение
если оно есть, то выполнять подключение к базе?
А как запрос к базе сделаешь при отсутствии подключения?
Цитата Сообщение от Burnoutman Посмотреть сообщение
Больше ничего не нужно экранировать или ещё чего,просто сравнивать названия и всё?
Для чего нужно экранирование. Чтобы символ, который имеет специальное значение в некотором контексте этого специального значения лишить. И если есть список готовых для безопасной подстановки в запрос строк, то зачем еще его экранировать?
1
8 / 8 / 5
Регистрация: 05.04.2012
Сообщений: 165
09.11.2017, 00:20  [ТС] 7
Цитата Сообщение от Jewbacabra Посмотреть сообщение
Можешь, но зачем делать лишний запрос?
Цитата Сообщение от Jewbacabra Посмотреть сообщение
А как запрос к базе сделаешь при отсутствии подключения?
Что-то я недопонимаю видимо. У меня всё работает так:
в админке я создаю страницу,это таблица содержит в себе поля id, title,name_page,get_page,text. Там же в админке,сразу после создания,появляется ссылка на созданную страницу в виде
HTML5
1
<a href="http://new.com/index.php?page=home">Главная страница</a>
Когда пользователь нажимает на ссылку идёт передача GET параметра. Этот запрос GET содержит в себе поле get_page,оно такое же как и название таблицы. На странице index.php переменной $page присваивается значение переменной $_GET['page'], далее всё это подставляется в запрос к БД
PHP
1
$result=$baza->query("SELECT `title` FROM `$page`");
и пользователь видит содержимое страницы которую запросил. Также в базе данных есть таблица,которая хранит все существующие таблицы. Просто,если как Вы говорите,зачем делать лишний запрос,а откуда брать названия новых таблиц для сравнения? Ну не вносить же их каждый раз в код после создания.
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
09.11.2017, 00:22 8
Лучший ответ Сообщение было отмечено Burnoutman как решение

Решение

Цитата Сообщение от Burnoutman Посмотреть сообщение
в админке я создаю страницу,это таблица содержит в себе поля id, title,name_page,get_page,text.
т.е для каждой страницы создаются динамически отдельная таблица? Не надо так делать
1
8 / 8 / 5
Регистрация: 05.04.2012
Сообщений: 165
09.11.2017, 00:36  [ТС] 9
Правильно будет все страницы хранить в одной таблице?
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
09.11.2017, 00:56 10
Цитата Сообщение от Burnoutman Посмотреть сообщение
Правильно будет все страницы хранить в одной таблице?
да.
1
8 / 8 / 5
Регистрация: 05.04.2012
Сообщений: 165
10.11.2017, 01:04  [ТС] 11
А можно на одной странице одновременно использовать подключение к базе PDO и обычное,чтобы работало query? Есть запросы в БД,которые просто прописаны в коде без использования переменных и они все не работают из-за подключения способом DSN для PDO.
Что-то это PDO тёмный лес какой-то.
PDO
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
//Соединение с базой данных PDO
 
$host='localhost';
$db='имя базы';
$user='user';
$pass='пароль';
$charset = 'utf8';
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
    $opt = [
        PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        PDO::ATTR_EMULATE_PREPARES   => false,
    ];
$pdo = new PDO($dsn, $user, $pass, $opt);
?>
mysqli_query
PHP
1
2
3
4
5
6
7
8
9
10
<?php
//Соединение с базой данных
$baza =  new mysqli('localhost', 'user', 'пароль','имя базы');
mysqli_set_charset($baza, "utf8");
if(mysqli_connect_errno())
{
 echo "Невозможно подключиться".mysqli_connect_error();
 exit();
}
?>
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
10.11.2017, 11:30 12
Burnoutman, смотри ошибки pdo
0
8 / 8 / 5
Регистрация: 05.04.2012
Сообщений: 165
14.11.2017, 00:04  [ТС] 13
Если использовать белый список для защиты от инъекций,так будет правильно?
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$page="";
$array_page=['novosty','zayvki','onas','book','home','user']; //названия страниц закреплённые за кнопками пример http://название сайта/index.php?page=home
$result=$baza->query("SELECT `get_page` FROM `all_pages`"); //названия страниц из БД
while($array=mysqli_fetch_array($result))
{
    $array_page[].=$array[0];
}
 if(in_array($_GET['page'],$array_page))
{
       $page=$_GET['page'];
       Тут выполняется код.
}
else
{
    echo'<script type="text/javascript">location.href="http://название сайта/index.php?page=home";</script>';
}
Решение работает,но меня смущает,сколько памяти занимает такой массив как $array_page,если страниц будет много? Не начнёт ли сайт тормозить?
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
14.11.2017, 00:14 14
Цитата Сообщение от Burnoutman Посмотреть сообщение
так будет правильно?
явно что-то не то.
Тут и вытаскивание всех строк вместо одной, и применение операции конкатенации к массиву, и редирект на js.
1
8 / 8 / 5
Регистрация: 05.04.2012
Сообщений: 165
14.11.2017, 00:31  [ТС] 15
Цитата Сообщение от Jewbacabra Посмотреть сообщение
Тут и вытаскивание всех строк вместо одной
А как тогда сравнить,есть у меня в базе такие или нет, не делая при этом запрос в базу?

Цитата Сообщение от Jewbacabra Посмотреть сообщение
применение операции конкатенации к массиву
Думал,что так можно


Цитата Сообщение от Jewbacabra Посмотреть сообщение
редирект на js.
header('Location:')?
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
14.11.2017, 00:33 16
Цитата Сообщение от Burnoutman Посмотреть сообщение
А как тогда сравнить,есть у меня в базе такие или нет, не делая при этом запрос в базу?
делая запрос в базу, используя WHERE
Цитата Сообщение от Burnoutman Посмотреть сообщение
header('Location:')?
да
1
8 / 8 / 5
Регистрация: 05.04.2012
Сообщений: 165
14.11.2017, 00:37  [ТС] 17
Цитата Сообщение от Jewbacabra Посмотреть сообщение
делая запрос в базу, используя WHERE
Тогда получается я в запрос подставляю переменную которая приходит от пользователя. Ведь белым списком я и пытаюсь избежать этого запроса без проверки на существующие страницы.
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
14.11.2017, 00:52 18
Burnoutman, что мешает использовать prepared statements?
1
8 / 8 / 5
Регистрация: 05.04.2012
Сообщений: 165
14.11.2017, 09:24  [ТС] 19
Цитата Сообщение от Jewbacabra Посмотреть сообщение
что мешает использовать prepared statements?
Вот так?
PHP
1
2
3
$page=$_GET['page'];
$result=$baza->prepare("SELECT `title` FROM `all_pages` WHERE `get_page`=?");
$result->bind_param("s",$page);
Но я опять застреваю на этом,как теперь достать значение из базы? Раньше,после этого кода я делал
PHP
1
2
3
4
while($array=mysqli_fetch_array($result))
    {
        echo $array['title'];
    }
но так не работает
Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
14.11.2017, 09:47 20
Burnoutman, смотри документацию
https://secure.php.net/manual/... repare.php
1
14.11.2017, 09:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.11.2017, 09:47
Помогаю со студенческими работами здесь

Защита от sql инъекций cookie
Когда авторизированный пользователь шагает по сайту у него каждый раз проверяется куки(записывается...

PDO: Защита от SQL инъекции
Здравствуйте. Интересует способ защиты от SQL-инъекции, с БД работаю используя PDO. Читал про...

Защита от инъекций
Доброе утро форумчане! В PDO запросы типа: INSERT INTO {$this-&gt;table} (login, name, email,...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru