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

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

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

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

Сообщение kupidon » 26.03.2016 4:49

Добрый день , пишу небольшую доработку для своего форума. Пожалуйста помогите очистить 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
Поддержка
Поддержка
Сообщения: 3452
Зарегистрирован: 28.04.2014 8:16
Благодарил (а): 38 раз
Поблагодарили: 926 раз

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

Сообщение LavIgor » 26.03.2016 9:14

kupidon, Вы перемудрили с экранированием.
Какова итоговая цель функции?
Цель всего этого должна быть не удалить теги и спецсимволы, а не допустить инъекцию, обрабатывая данные в соответствии с предметной областью. В Вашем случае должно быть достаточно использовать приведение к типу int, раз ID числовое.

Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 14536
Зарегистрирован: 12.05.2006 18:16
Откуда: Красноярск
Благодарил (а): 348 раз
Поблагодарили: 1556 раз

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

Сообщение rxu » 26.03.2016 9:17

$cl_str = request_var('$cl_str', 0); производит необходимую очистку и на выходе дает целое число.
Смысла в дополнительной очистке не видно.
Изображение

Аватара пользователя
kupidon
phpBB 1.4.4
Сообщения: 120
Зарегистрирован: 04.04.2012 20:02
Благодарил (а): 62 раза

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

Сообщение kupidon » 26.03.2016 11:56

записал в функцию только эту строку: $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
Поддержка
Поддержка
Сообщения: 9768
Зарегистрирован: 08.08.2011 2:02
Благодарил (а): 175 раз
Поблагодарили: 2721 раз

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

Сообщение Татьяна5 » 26.03.2016 11:57

В 3.1 кавычка попасть не могла

Аватара пользователя
kupidon
phpBB 1.4.4
Сообщения: 120
Зарегистрирован: 04.04.2012 20:02
Благодарил (а): 62 раза

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

Сообщение kupidon » 26.03.2016 18:18

у меня 3.0. Поскольку создание тем для 3.0 закрыто- написал сюда. Полагал, что решение не зависит от форума.
Что посоветуете? как получить рабочий sql запрос ?

Аватара пользователя
Татьяна5
Поддержка
Поддержка
Сообщения: 9768
Зарегистрирован: 08.08.2011 2:02
Благодарил (а): 175 раз
Поблагодарили: 2721 раз

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

Сообщение Татьяна5 » 26.03.2016 18:20

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

$cl_str = (int) request_var('$cl_str', 0);

Аватара пользователя
Sumanai
phpBB 3.0.0 RC5
Сообщения: 1664
Зарегистрирован: 02.11.2014 13:57
Благодарил (а): 267 раз
Поблагодарили: 219 раз

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

Сообщение Sumanai » 26.03.2016 20:28

Татьяна5 писал(а): (int)
Тут лишнее, приведение типов выполняется функцией request_var.

Аватара пользователя
LavIgor
Поддержка
Поддержка
Сообщения: 3452
Зарегистрирован: 28.04.2014 8:16
Благодарил (а): 38 раз
Поблагодарили: 926 раз

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

Сообщение LavIgor » 26.03.2016 21:25

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
Поддержка
Поддержка
Сообщения: 9768
Зарегистрирован: 08.08.2011 2:02
Благодарил (а): 175 раз
Поблагодарили: 2721 раз

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

Сообщение Татьяна5 » 26.03.2016 22:07

Sumanai писал(а): приведение типов выполняется
kupidon писал(а): добавил в адрес одинарную кавычку, и сразу получил ошибку:
то есть закомментированная кавычка попала в sql запрос....
Видимо, в той версии не выполняется

Аватара пользователя
Sumanai
phpBB 3.0.0 RC5
Сообщения: 1664
Зарегистрирован: 02.11.2014 13:57
Благодарил (а): 267 раз
Поблагодарили: 219 раз

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

Сообщение Sumanai » 26.03.2016 23:25

Татьяна5 писал(а): Видимо, в той версии не выполняется
Выполняется. Он не использовал эту функцию, а брал из суперглобального массива $_GET.

Аватара пользователя
kupidon
phpBB 1.4.4
Сообщения: 120
Зарегистрирован: 04.04.2012 20:02
Благодарил (а): 62 раза

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

Сообщение kupidon » 28.03.2016 9:22

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

Можно маленький вопросик? Проверьте пожалуйста синтаксис 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
Поддержка
Поддержка
Сообщения: 9768
Зарегистрирован: 08.08.2011 2:02
Благодарил (а): 175 раз
Поблагодарили: 2721 раз

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

Сообщение Татьяна5 » 28.03.2016 12:19

Нет. В типе данных "строка" допустимы и звёздочки, и что угодно

Аватара пользователя
LavIgor
Поддержка
Поддержка
Сообщения: 3452
Зарегистрирован: 28.04.2014 8:16
Благодарил (а): 38 раз
Поблагодарили: 926 раз

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

Сообщение LavIgor » 28.03.2016 13:00

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

Примеров различных проверок предостаточно в коде движка.

Аватара пользователя
kupidon
phpBB 1.4.4
Сообщения: 120
Зарегистрирован: 04.04.2012 20:02
Благодарил (а): 62 раза

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

Сообщение kupidon » 28.03.2016 13:40

Все, спасибо большущее всем откликнувшимся. Так и сделаю ( разобью строку на массив и проверю каждый элемент).
Вопрос решен.

Перенесено из форума Для авторов (phpBB 3.1.x) в форум Для авторов (phpBB 3.0.x) 24.04.2016 13:06 модератором Sheer

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