Уважаемые пользователи!
C 7 ноября 2020 года phpBB Group прекратила выпуск обновлений и завершила дальнейшее развитие phpBB версии 3.2.
С 1 августа 2024 года phpBB Group прекращает поддержку phpBB 3.2 на официальном сайте.
Сайт официальной русской поддержки phpBB Guru продолжит поддержку phpBB 3.2 до 31 декабря 2024 года.
С учетом этого, настоятельно рекомендуется обновить конференции до версии 3.3.

Escape: очистить запрос GET

Форум для авторов модов для phpBB 3.0.x. Здесь можно попросить помощи в разработке у коллег.
Правила форума
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Переход на 3.0.6 и выше | FAQ-3 (phpbb3) | Как задавать вопросы | Как устанавливать моды

Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение ;) ).
Аватара пользователя
kupidon
phpBB 1.4.4
Сообщения: 120
Стаж: 11 лет 11 месяцев
Благодарил (а): 62 раза

Escape: очистить запрос GET

Сообщение kupidon »

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

имею файл подключения к БД
dbconnect.php:

Код: Выделить всё

header('Content-Type: text/html; charset=utf-8');
	define('IN_PHPBB', true);
$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : '../';
$phpEx = substr(strrchr(__FILE__, '.'), 1);
include($phpbb_root_path . 'common.' . $phpEx);
include($phpbb_root_path . 'includes/mcp/mcp_main.' . $phpEx);
include($phpbb_root_path . 'includes/functions_admin.' . $phpEx);
mysql_set_charset("utf8",$db);
// Start session management
$user->session_begin();
$auth->acl($user->data);
$user->setup('mcp');
имею файл с функцией очистки запроса:
myfunctions.php :

Код: Выделить всё

function clear_string ($cl_str)
{$cl_str=$db->sql_escape($cl_str);$cl_str=$db->sql_escape($cl_str);($cl_str); // очищает от тегов
$cl_str = strip_tags(html_entity_decode($cl_str)); // очищает от тегов

//$cl_str=mysql_real_escape_string($cl_str); 
//$cl_str= str_replace("\'", "''", addslashes($cl_str)); // экранирует спецсимволы
//$cl_str = request_var('$cl_str', 0);
//$cl_str=$db->sql_escape(utf8_clean_string($cl_str));

$cl_str=trim($cl_str); // удаляет пробелы
$cl_str=$db->sql_escape($cl_str);

return $cl_str;
}
и сам исполняющий файл:

Код: Выделить всё

include("include/dbconnect.php");	
include("include/myfunctions.php");	
$cat= clear_string ($_GET["cat"]);
$query = 'SELECT *  FROM items  WHERE catalog_id = '. $cat.' ;
Теги очищаются, пробелы не удаляются (((, и если ESCAPE прописывать в функции ( как выше), то получаю белую страницу.

Если функцию ESCAPE прописать прямо в запросе, то работает, получаю экранирование слешами:

Код: Выделить всё

$query = 'SELECT *   FROM items   WHERE catalog_id = '. $db->sql_escape($cat);

Теперь вопросы:
1. можно ли и как правильно прописать ESCAPE и TRIM в отдельной функции ?
2. как сделать, чтобы при правильном экранировании и удалении пробелов запрос исполнялся, а не получалась ошибка
Сейчас он получается такой и обрабатываться не хочет : SELECT * FROM sp_items WHERE catalog_id = 17658\\\' \\\'\\\'

заранее благодарю за ваше внимание к моему вопросу. спасибо
Аватара пользователя
LavIgor
Former team member
Сообщения: 3468
Стаж: 9 лет 11 месяцев
Благодарил (а): 41 раз
Поблагодарили: 932 раза

Re: Escape: очистить запрос GET

Сообщение LavIgor »

kupidon, Вы перемудрили с экранированием.
Какова итоговая цель функции?
Цель всего этого должна быть не удалить теги и спецсимволы, а не допустить инъекцию, обрабатывая данные в соответствии с предметной областью. В Вашем случае должно быть достаточно использовать приведение к типу int, раз ID числовое.
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16313
Стаж: 17 лет 10 месяцев
Откуда: Красноярск
Благодарил (а): 533 раза
Поблагодарили: 2119 раз
Контактная информация:

Re: Escape: очистить запрос GET

Сообщение rxu »

$cl_str = request_var('$cl_str', 0); производит необходимую очистку и на выходе дает целое число.
Смысла в дополнительной очистке не видно.
Изображение
Аватара пользователя
kupidon
phpBB 1.4.4
Сообщения: 120
Стаж: 11 лет 11 месяцев
Благодарил (а): 62 раза

Re: Escape: очистить запрос GET

Сообщение kupidon »

записал в функцию только эту строку: $cl_str = request_var('$cl_str', 0);

добавил в адрес одинарную кавычку, и сразу получил ошибку:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '\' AND hidden=0 ORDER BY id_items DESC' at line 3 [1064]
SQL
SELECT * FROM sp_items WHERE catalog_id = 17659\' AND hidden=0 ORDER BY id_items DESC
BACKTRACE
то есть закомментированная кавычка попала в sql запрос....можно ли сделать так, чтобы запрос исполнился без всяких инъекций?
Аватара пользователя
Татьяна5
Поддержка
Поддержка
Сообщения: 12372
Стаж: 12 лет 7 месяцев
Благодарил (а): 223 раза
Поблагодарили: 3517 раз
Контактная информация:

Re: Escape: очистить запрос GET

Сообщение Татьяна5 »

В 3.1 кавычка попасть не могла
Аватара пользователя
kupidon
phpBB 1.4.4
Сообщения: 120
Стаж: 11 лет 11 месяцев
Благодарил (а): 62 раза

Re: Escape: очистить запрос GET

Сообщение kupidon »

у меня 3.0. Поскольку создание тем для 3.0 закрыто- написал сюда. Полагал, что решение не зависит от форума.
Что посоветуете? как получить рабочий sql запрос ?
Аватара пользователя
Sumanai
phpBB 3.0.0 RC5
Сообщения: 1668
Стаж: 9 лет 4 месяца
Благодарил (а): 267 раз
Поблагодарили: 216 раз
Контактная информация:

Re: Escape: очистить запрос GET

Сообщение Sumanai »

Татьяна5 писал(а): (int)
Тут лишнее, приведение типов выполняется функцией request_var.
Аватара пользователя
LavIgor
Former team member
Сообщения: 3468
Стаж: 9 лет 11 месяцев
Благодарил (а): 41 раз
Поблагодарили: 932 раза

Re: Escape: очистить запрос GET

Сообщение LavIgor »

kupidon писал(а): записал в функцию только эту строку: $cl_str = request_var('$cl_str', 0);
Её не в функцию записывать нужно, а в сам код.
Т.е. примерно так:

Код: Выделить всё

include("include/dbconnect.php");
$cat= request_var('cat', 0);
$query = 'SELECT * FROM items WHERE catalog_id = '. (int) $cat;
Приведение типов в запросе лишним не будет, хоть и избыточно в данном конкретном случае.
Аватара пользователя
Татьяна5
Поддержка
Поддержка
Сообщения: 12372
Стаж: 12 лет 7 месяцев
Благодарил (а): 223 раза
Поблагодарили: 3517 раз
Контактная информация:

Re: Escape: очистить запрос GET

Сообщение Татьяна5 »

Sumanai писал(а): приведение типов выполняется
kupidon писал(а): добавил в адрес одинарную кавычку, и сразу получил ошибку:
то есть закомментированная кавычка попала в sql запрос....
Видимо, в той версии не выполняется
Аватара пользователя
Sumanai
phpBB 3.0.0 RC5
Сообщения: 1668
Стаж: 9 лет 4 месяца
Благодарил (а): 267 раз
Поблагодарили: 216 раз
Контактная информация:

Re: Escape: очистить запрос GET

Сообщение Sumanai »

Татьяна5 писал(а): Видимо, в той версии не выполняется
Выполняется. Он не использовал эту функцию, а брал из суперглобального массива $_GET.
Аватара пользователя
kupidon
phpBB 1.4.4
Сообщения: 120
Стаж: 11 лет 11 месяцев
Благодарил (а): 62 раза

Re: Escape: очистить запрос GET

Сообщение kupidon »

ОГРОМНОЕ спасибо. Сегодня потестил..пробелы, теги кавычки , звездочку. все экранирует, и запрос исполняется!!!

Можно маленький вопросик? Проверьте пожалуйста синтаксис request_var() для POST?
В поле input ввожу через запятую числа ( номера топиков в которых надо кое что удалить).

Код: Выделить всё

if (isset($_POST['delpurch']))
{
$delpurch = request_var('delpurch', '');  //очищаю принятое
}
Потом запросом выбираю этот список тем (надо чтобы не попало ничего другого, только цифры через запятую введенные).
Боюсь что поставлю звездочку в поле ввода и выберется все, и...думать не хочется

Код: Выделить всё

if ($delpurch)
{
$query = 'SELECT * FROM sp_items  WHERE '. $db->sql_in_set('purchase_id', $delpurch, false);
Если звездочку поставлю в текстбокс или еще что нибудь очистится POST ?.

Такой мой код безопасный?
Аватара пользователя
Татьяна5
Поддержка
Поддержка
Сообщения: 12372
Стаж: 12 лет 7 месяцев
Благодарил (а): 223 раза
Поблагодарили: 3517 раз
Контактная информация:

Re: Escape: очистить запрос GET

Сообщение Татьяна5 »

Нет. В типе данных "строка" допустимы и звёздочки, и что угодно
Аватара пользователя
LavIgor
Former team member
Сообщения: 3468
Стаж: 9 лет 11 месяцев
Благодарил (а): 41 раз
Поблагодарили: 932 раза

Re: Escape: очистить запрос GET

Сообщение LavIgor »

kupidon писал(а): Такой мой код безопасный?
Поскольку Вы используете оболочку DBAL, то да, относительно безопасный.
Но поскольку нет проверки типов данных, запрос может завершиться с ошибками.
Поэтому можно было бы сначала, например, достать отдельные значения через explode, потом проверить типы и только после этого делать запрос.

Примеров различных проверок предостаточно в коде движка.
Аватара пользователя
kupidon
phpBB 1.4.4
Сообщения: 120
Стаж: 11 лет 11 месяцев
Благодарил (а): 62 раза

Re: Escape: очистить запрос GET

Сообщение kupidon »

Все, спасибо большущее всем откликнувшимся. Так и сделаю ( разобью строку на массив и проверю каждый элемент).
Вопрос решен.
Перенесено из форума Для авторов (phpBB 3.1.x) в форум Для авторов (phpBB 3.0.x) 24.04.2016 13:06 модератором Sheer

Закрыто

Вернуться в «Для авторов (phpBB 3.0.x)»