Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.81/21: Рейтинг темы: голосов - 21, средняя оценка - 4.81
28 / 24 / 10
Регистрация: 26.04.2015
Сообщений: 307

Белые списки в SQL

01.10.2019, 23:52. Показов 4569. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть некий SQL-запрос:
PHP
1
2
3
4
5
$id_user = $_POST['user'];
$id_x = $_POST['id_x'];
$name = $_POST['name'];
    $stmt = $pdo->prepare("INSERT INTO Training (`id_user`, `id_blabla`, `name`) VALUES (:id_user, :id_x, :name)");
    $stmt->execute(['id_user' => $id_user, 'id_x' => $id_x, 'name' => $name]);
Перепишите, пожалуйста, данный код с использованием "белых списков". Хочется наглядно увидеть как их использовать, т.к. я ни разу не юзал данную защиту.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
01.10.2019, 23:52
Ответы с готовыми решениями:

Связанные списки в sql
Это в Эксель Вопрос такой: Как сделать в sql такой же список? Т.е. чтобы в списке можно было выбрать значение из первой...

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

Delphi 7 + динамические списки + база MS SQL = большой объем используемой памяти
Добрый день! Ситуация: Пишу парсер. В папке перебираются файлы с логами (от 1 до 100 МБ текстовой информации), вытаскиваются данные...

18
28 / 24 / 10
Регистрация: 26.04.2015
Сообщений: 307
03.10.2019, 00:50  [ТС]
аапчик теме!
0
28 / 24 / 10
Регистрация: 26.04.2015
Сообщений: 307
31.03.2021, 14:52  [ТС]
аап!

Не по теме:

искал другой вопрос по своим постам, и увидел, что на этот вопрос - ответ не получил.
В гугле не забанет, но адекватно доходичивой инфы не нашёл, хотелось бы наглядности на приведенном примере. Вопрос всё ещё актуален! (некромантией не занимаюсь, хоть и пост за конец 19-го года xD)

0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
31.03.2021, 16:08
Белые списки обычно используют при динамической подстановке имен таблиц/столбцов. Здесь же все имена захардкожены, так что не очень понятно что ты хочешь получить.
0
28 / 24 / 10
Регистрация: 26.04.2015
Сообщений: 307
03.04.2021, 00:26  [ТС]
Цитата Сообщение от Jewbacabra Посмотреть сообщение
Здесь же все имена захардкожены, так что не очень понятно что ты хочешь получить.
Jewbacabra, я бы хотел увидеть как бы выглядел этот запрос, если бы предварительно использовались белые списки, в которых будут перечислены мои поля и/или имя таблиц(-ы), которые я юзаю в запросе.
В целом мне интересно наглядная реализация преобразования произвольного (как пример я выбрал обычный INSERT PDO) SQL-кода в код, полностью защищённый от любых SQL-инъекций.

В гугле конечно есть инфа, напр., вот тут 1-й и 3-й ответы довольно интересные:
Кликните здесь для просмотра всего текста
https://coderoad.ru/60174/Как-... -SQL-в-PHP
Также весьма увекательна статейка на хабре по XSS: https://habr.com/ru/post/511318/
Ну или на стековерфлов был вопросик по preraped statment и их эффективности против SQL-инъекций - "Защищают ли подготовленные выражения/переменные полностью от SQL инъекций?" (но согласно правил форума ссылку не дам )


но все они как бы дают общее понимание, а хотелось бы чего-то более приземисто-практичного в стиле код "до/после", когда обычный PDO-код дополняется ещё какими-то фичами, рекомендациями делать какие-то доп. обработки над переменными/именами полей и операторами SQL и всё это вместе позволит усилить защиту передаваемых данных в бд.
Ну а в случае с SELECT'ом ещё и пост-обработку полученных данных от запроса (т.к. как было классно описано фразой в одном каком-то посте на хабре (к сожалению не могу дать ссылку, но примерная суть фразы): "вы не должны доверять входящим данным, а также не должны доверять своей базе данных, т.к. и данные в ней теоретически могут быть скомпрометированы, если недоброжелатель каким-либо образом получит доступ к базе).

Буду признателен за подробный ответ по самому вопросу, а также за возможные полезные ссылки с прикладными примерами решения проблем уязвимости кода.
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
03.04.2021, 06:56
Цитата Сообщение от Wolver Посмотреть сообщение
я бы хотел увидеть как бы выглядел этот запрос, если бы предварительно использовались белые списки, в которых будут перечислены мои поля и/или имя таблиц(-ы), которые я юзаю в запросе.
PHP
1
2
3
4
5
6
7
8
9
$accepted = ['id', 'username', 'created_at'];
 
$order_by = filter_input(INPUT_GET, 'order_by');
 
if (!in_array($order_by, $accepted)) {
    $order_by = $accepted[0];
}
 
$query = "SELECT id, username, created_at FROM users ORDER BY {$order_by}";
Добавлено через 11 минут
Цитата Сообщение от Wolver Посмотреть сообщение
когда обычный PDO-код дополняется ещё какими-то фичами, рекомендациями делать какие-то доп. обработки над переменными/именами полей и операторами SQL и всё это вместе позволит усилить защиту передаваемых данных в бд.
Используйте подготовленные запросы (prepated statements), а для имен полей/таблиц -- белые списки. Вот и вся обработка. Дополнительных обработок не нужно (кроме валидации входящих данных).
Цитата Сообщение от Wolver Посмотреть сообщение
также не должны доверять своей базе данных
Используйте перед выводом на страницу:
https://www.php.net/manual/ru/... tities.php
https://www.php.net/manual/ru/... lchars.php
Было так в шаблоне:
PHP
1
<?=$artice['title']?>
Стало так:
PHP
1
<?=htmlspecialchars($artice['title'])?>
А еще лучше, чтобы укоротить код, напишите функцию "e", которая вызывает, в свою очередь, "htmlspecialchars". И используйте ее:
PHP
1
<?=e($artice['title'])?>
А еще лучше -- используйте шаблонизатор. Например, Twig.
1
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
03.04.2021, 14:06
Цитата Сообщение от Wolver Посмотреть сообщение
я бы хотел увидеть как бы выглядел этот запрос, если бы предварительно использовались белые списки, в которых будут перечислены мои поля и/или имя таблиц(-ы), которые я юзаю в запросе
А в чем сложность? Белый список - фактически массив. Нужно просто проверить есть ли то, что пытаешься подставить в списке.
Цитата Сообщение от Wolver Посмотреть сообщение
когда обычный PDO-код дополняется ещё какими-то фичами, рекомендациями делать какие-то доп. обработки над переменными/именами полей и операторами SQL
Нужно в первую очередь понимать что и зачем делаешь, а не гоняться за некими "фичами". В данном случае количество != качество. Даже в 2021 периодически всплывают всякие непонятные "очищающие функции", от которых только вред.

Цитата Сообщение от Wolver Посмотреть сообщение
усилить защиту передаваемых данных в бд
От чего нужно защищать данные?
Это заблуждение, что всякие подготовленные выражения, функции для экранирования и т.д нужны для "защиты", "защита" - это скорее побочный эффект. Их же основная задача - просто обеспечить нормальную работу, позволив или отделять данные от самого запроса, тем самым не надо думать как подставить данные и не сломать запрос, или же строку привести к такому виду, что с точки зрения бд это будет именно строка и т.д.

Цитата Сообщение от Wolver Посмотреть сообщение
данные в ней теоретически могут быть скомпрометированы, если недоброжелатель каким-либо образом получит доступ к базе
В таком случае "поздно пить боржоми"

Цитата Сообщение от Para bellum Посмотреть сообщение
Стало так
Должно стать так
PHP/HTML
1
<?= htmlentities($artice['title'], ENT_QUOTES, 'UTF-8') ?>
И помнить про ссылки, и всякие onclick где потенциально может пройти лишнее
PHP
1
printf('<a href="%s">hacked link</a>', htmlentities('javascript:alert("Hacked")', ENT_QUOTES, 'UTF-8'));
Как это можно обойти - просто не подставлять динамически ссылки с данными, полученными извне. Если без этого никак - например, сперва распарсить ссылку и проверить протокол (возможно еще и домен), все кроме https не выводить вообще.
1
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
03.04.2021, 14:35
Цитата Сообщение от Jewbacabra Посмотреть сообщение
Должно стать так
Пусть будет так
Цитата Сообщение от Jewbacabra Посмотреть сообщение
В таком случае "поздно пить боржоми"
Не совсем. В случае, если вывод экранируется, не проведешь атаку на пользователей ресурса всякими beef'ами.
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
03.04.2021, 14:39
Цитата Сообщение от Para bellum Посмотреть сообщение
Не совсем. В случае, если вывод экранируется, не проведешь атаку на пользователей ресурса всякими beef'ами.
Я к тому, что если кто получил доступ к базе, или к любой другой части инфраструктуры - это гораздо большая проблема.
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
03.04.2021, 15:18
Посмотрел на проблему с разных сторон, не только с технической: да, вы правы.
0
Надуваю лягушек
Эксперт PHP
 Аватар для Царь Бабай
289 / 219 / 93
Регистрация: 01.05.2014
Сообщений: 742
04.04.2021, 08:35
Типа такого может?
PHP
1
<?php htmlentities(nl2br($artice['title'], ENT_QUOTES, 'UTF-8')); ?>
PHP
1
printf('<a href="%s">hacked link</a>', htmlentities(nl2br('javascript:alert("Hacked")', ENT_QUOTES, 'UTF-8')));
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
04.04.2021, 12:18
Цитата Сообщение от Царь Бабай Посмотреть сообщение
Типа такого может?
"типа такого может" что?
0
28 / 24 / 10
Регистрация: 26.04.2015
Сообщений: 307
14.04.2021, 20:11  [ТС]
Цитата Сообщение от Para bellum Посмотреть сообщение
А еще лучше -- используйте шаблонизатор. Например, Twig.
пока что хочу понять тонкости без усложнения. За остальное спс.

Цитата Сообщение от Jewbacabra Посмотреть сообщение
Должно стать так
PHP
1
<?= htmlentities($artice['title'], ENT_QUOTES, 'UTF-8') ?>
хорошо, а если это поле будет не заголовком как в примере моего поста, а скажем является логином при регистрации. Есть ли смысл в преобразовании специальных символов в HTML-сущности посредством htmlentities?
Или проще пропустить пришедшую строку через регулярку вида:
PHP
1
$login = preg_replace("/[^а-яёa-z]/iu", '', $login);
оставив только буквы и цифры (ну или ещё несколько символов (описав их в регулярке) если нужно)? Принудительный парсинг строки регуляркой тоже же защитит от XSS?

А что делать со строкой почты? согласно RFC282 в ней может содержатся и амперсанд и скорбки, которые будут преобразовываться htmlspecialchars/htmlentities... Получается в базе они будут храниться в преобразованном виде, а если доставать из базы то декодировать через htmlspecialchars_decode() / html_entity_decode()?

И ещё вопросик про почту но немного не по теме поста (просто связь с RFC282):
Кликните здесь для просмотра всего текста
Я нашёл вот RFC 822 Email анализатор адресов в PHP - стоит ли его использовать для проверок строки адреса почты на правильность?


Цитата Сообщение от Jewbacabra Посмотреть сообщение
И помнить про ссылки
да, действительно это упоминается в мануале PHP:
Кликните здесь для просмотра всего текста
согласно php.net-htmlentities
Параметр «ENT_QUOTES» не защищает вас от оценки javascript в определенных атрибутах тега, таких как атрибут «href» тега «a». При нажатии на ссылку ниже будет выполнен указанный JavaScript:

Цитата Сообщение от Jewbacabra Посмотреть сообщение
Если без этого никак - например, сперва распарсить ссылку и проверить протокол (возможно еще и домен), все кроме https не выводить вообще.
Можно пожалуйста пример?

Цитата Сообщение от Царь Бабай Посмотреть сообщение
Типа такого может?
Это не понял. К чему генерировать разрыв строки посредством nl2br?
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
14.04.2021, 21:25
Цитата Сообщение от Wolver Посмотреть сообщение
хорошо, а если это поле будет не заголовком как в примере моего поста, а скажем является логином при регистрации. Есть ли смысл в преобразовании специальных символов в HTML-сущности посредством htmlentities?
Или проще пропустить пришедшую строку через регулярку вида
Можно, но лучше так не делать, даже если заведомо не будет "опасных" символов. Чем всё будет однообразнее, тем лучше, тем меньше вероятность, что где-нибудь не потеряется строка, которую нужно бы закодировать.
Цитата Сообщение от Wolver Посмотреть сообщение
Получается в базе они будут храниться в преобразованном виде, а если доставать из базы то декодировать через htmlspecialchars_decode() / html_entity_decode()?
Не нужно в базе хранить строки, обработанные htmlentities
Цитата Сообщение от Wolver Посмотреть сообщение
Можно пожалуйста пример?
https://www.php.net/manual/ru/... se-url.php
PHP
1
2
3
4
$url = 'blah-blah-blah';
if (parse_url($url)[PHP_URL_SCHEME] !== 'https') {
    // throw exception ...
}
0
28 / 24 / 10
Регистрация: 26.04.2015
Сообщений: 307
14.04.2021, 21:46  [ТС]
Цитата Сообщение от Jewbacabra Посмотреть сообщение
Не нужно в базе хранить строки, обработанные htmlentities
Не понимаю. Мы же, получив строку с <input>'a, обрабатываем её через htmlentities, а потом её надо INSERT'ом запихнуть в базу. Если в строке будут символы, которые преобразует ф-ция, то и в базу попадут обработанные символы.
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
14.04.2021, 22:13
Цитата Сообщение от Wolver Посмотреть сообщение
Мы же, получив строку с <input>'a, обрабатываем её через htmlentities, а потом её надо INSERT'ом запихнуть в базу. Если в строке будут символы, которые преобразует ф-ция, то и в базу попадут обработанные символы
htmlentities следует использовать для подстановки строки в html документ. Никакого отношения к бд эта функция не имеет
0
28 / 24 / 10
Регистрация: 26.04.2015
Сообщений: 307
14.04.2021, 22:47  [ТС]
Цитата Сообщение от Jewbacabra Посмотреть сообщение
htmlentities следует использовать для подстановки строки в html документ.
Стоп, я походу разобрался с этим, спс)
Но вопрос, - полученные сервером строки из html, надо ли ещё как-то обрабатывать до их записи в базу? Или prepated statements абсолютно полностью защищает от любой пакости из-за своей специфики отделения SQL оператора от значения?
И получается даже если нам юзер впихивает js-скрипт, мы его сохраняем как строку в базу, а при необходимости возвращая в html из базы мы очищаем потенциально опасные символы преобразуя в HTML-сущности?
PHP
1
2
3
4
5
6
7
8
    $qwe = $_POST["qwe"]; // = "<script>alert(document.cookie)</script>" 
    $stmt = $pdo->prepare("INSERT INTO Table (`qwe`) VALUES (:blabla)");
    $stmt->execute(['blabla' => $qwe]);
...
    $stmt = $pdo->query("SELECT `qwe` FROM Table");
    $row = $stmt->fetch(\PDO::FETCH_ASSOC);
    $field= htmlentities($row["qwe"], ENT_QUOTES, 'UTF-8');
echo json_encode($field);
Нужно ли что-то ещё делать до записи в базу?
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
14.04.2021, 23:03
Лучший ответ Сообщение было отмечено Wolver как решение

Решение

Цитата Сообщение от Wolver Посмотреть сообщение
Или prepated statements абсолютно полностью защищает от любой пакости из-за своей специфики отделения SQL оператора от значения?
да

Цитата Сообщение от Wolver Посмотреть сообщение
echo json_encode($field);
В данном случае htmlentities лишний - т.к. выводится json, а не html
Ну или наоборот - json_encode лишний, а htmlentities нужен
1
28 / 24 / 10
Регистрация: 26.04.2015
Сообщений: 307
15.04.2021, 00:30  [ТС]
Понятненько)
Ну в целом, я получил исчерпывающие ответы и на основной вопрос и на ответвления от него по защите кода.
Не знаю, какой из ответов считать лучшим, т.к. они информативно разношёрстны, но равноценны. Поэтому выберу последний как собирательный на мой последний коммент с кодом.
Jewbacabra, Para bellum, благодарю за развёрнутые комменты!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.04.2021, 00:30
Помогаю со студенческими работами здесь

Списки, списки, списки. не все так просто
Написать функцию, которая принимает 2 списка, содержащие одинаковое число строк, затем изменяет списки сопоставляя строки, занимающие...

Как преобразовать вложенные списки из строки в обычные списки?
Доброе утро, форумчане. Подскажите пожалуйста, мне нужно написать скрипт, который разбирает строку на список вложенный друг в друга....

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

Дан вектор, элементы которого списки из целых чисел.Заменить на NILL списки с суммой равной 0
Дан вектор, элементы которого списки из целых чисел.Заменить на NILL списки с суммой равной 0.

Списки, как склеить списки между собой?
Ребят, привет всем, есть код, в классе которого описаны несколько методов: добавление элемента в список, удаление и просмотр списка, дак...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru