=====
«Новый» фильтр и его where
#битрикс #orm #D7 #запрос
«Новый» фильтр и его where
$filter = \Bitrix\Main\Entity\Query::filter();
$filter->where();
$filter->whereNot();
$filter->whereColumn();
$filter->whereNull();
$filter->whereNotNull();
$filter->whereIn();
$filter->whereNotIn();
$filter->whereBetween();
$filter->whereNotBetween();
$filter->whereLike();
$filter->whereNotLike();
$filter->whereExists();
$filter->whereNotExists();
$filter->whereMatch();
$filter->whereNotMatch();
$filter->where();
$filter->whereNot();
$filter->whereColumn();
$filter->whereNull();
$filter->whereNotNull();
$filter->whereIn();
$filter->whereNotIn();
$filter->whereBetween();
$filter->whereNotBetween();
$filter->whereLike();
$filter->whereNotLike();
$filter->whereExists();
$filter->whereNotExists();
#битрикс #orm #D7 #запрос
=====
Пример использования нового фильтра, код из ядра
Пример использования нового фильтра, код из ядра
$filter = Main\Entity\Query::filter();#битрикс #orm #D7 #запрос
$filter->whereIn('PRODUCT_ID', $pageOfferIds);
$filter->where(
Main\Entity\Query::filter()
->logic('or')
->where('QUANTITY_FROM', '<=', 1)
->whereNull('QUANTITY_FROM')
);
$filter->where(
Main\Entity\Query::filter()
->logic('or')
->where('QUANTITY_TO', '>=', 1)
->whereNull('QUANTITY_TO'));
$iterator = Catalog\PriceTable::getList(array(
'select' => array(
'PRODUCT_ID', 'CATALOG_GROUP_ID', 'PRICE', 'CURRENCY',
'PRICE_SCALE', 'TMP_ID'
),
'filter' => $filter,
'order' => array('PRODUCT_ID' => 'ASC', 'CATALOG_GROUP_ID' => 'ASC')
));
while ($row = $iterator->fetch())
{
...
}
Обезопасивание данных
Метод:
Фильтру скармливаются ключи: get, post, files, headers, cookie.
Фильтровать можно сколько угодно раз. Единственный пример, встречающийся в коде ядра — класс
#битрикс #запрос #безопасность
$request= \Bitrix\Main\Context::getCurrent()->getRequest();Когда мы работаем с объектом запроса, получая _GET- и _POST-ключи, мы фактически работаем с сырыми данными, что не безопасно.
$request->get('sql_data');
$request->getPost('php_code');
$request
позволяет пропустить данные через фильтр.Метод:
addFilter
, аргумент — объект, реализующий интерфейс Bitrix\Main\Type\IRequestFilter
. Фильтру скармливаются ключи: get, post, files, headers, cookie.
Фильтровать можно сколько угодно раз. Единственный пример, встречающийся в коде ядра — класс
\Bitrix\Main\Web\PostDecodeFilter
, который отслеживает только _POST-ключи и приводит их в кодировку проекта.#битрикс #запрос #безопасность
Битриксоид из Колхоза
Обезопасивание данных $request= \Bitrix\Main\Context::getCurrent()->getRequest(); $request->get('sql_data'); $request->getPost('php_code'); Когда мы работаем с объектом запроса, получая _GET- и _POST-ключи, мы фактически работаем с сырыми данными, что не…
Исходя из проблематики, мы можем реализовать свой класс, который будет конвертировать нужные ключи в безопасный вид.
Наши действия:
1. Создаём класс с фильтром
Пример: https://pastebin.com/XT3ULHtC
2. Регистрируем его в автоподгрузку в init.php:
Наши действия:
1. Создаём класс с фильтром
Пример: https://pastebin.com/XT3ULHtC
2. Регистрируем его в автоподгрузку в init.php:
use \Bitrix\Main\Loader;3. Применяем перед чтением ключей из запроса:
Loader::registerAutoLoadClasses(null,
[
'\AlexeyGfi\SafeValueHelper' =>
'/bitrix/php_interface/include/AlexeyGfi/SafeValueHelper.php',
]
);
use Bitrix\Main\Context;#битрикс #запрос #безопасность
$request= Context::getCurrent()->getRequest();
$request->addFilter(new \AlexeyGfi\SafeValueHelper);
$request->getPost('php_code');