Перейти к публикации
Дизайн и модификация IPS Community IPBSkinsBETA
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...
HooLIGUN

Экранирование спец. символов

Рекомендованные сообщения

Добрый день. Подскажите, как экранировать спец символы php в приложении Страницы, чтобы их не обрабатывал движок?

Я получаю строки из базы, в которых могут содержаться символы, которые IPS пытается обработать, например {{ }} и т.д

Например, очень часто игровые ники игроков имеют такие символы

$nick = "¤{$}-|GODFATHER|-{$}¤";

И при выполнении страницы выходит ошибка

Цитата

[[Block blockkey is throwing an error]]

а в логе

Цитата

ParseError: syntax error, unexpected '}', expecting variable (T_VARIABLE) or '{' or '$' in /var/www/hooligun/data/www/system/Theme/Theme.php(4495) : eval()'d code:15
Stack trace:
#0 /var/www/hooligun/data/www//applications/cms/sources/Blocks/Block.php(209): IPS\_Theme::runProcessFunction('\tfunction conte...', 'content_blocks_...')
#1 /var/www/hooligun/data/www//system/Theme/Theme.php(4495) : eval()'d code(9): IPS\cms\Blocks\_Block::display(Object(IPS\cms\Blocks\Block))
#2 /var/www/hooligun/data/www//applications/cms/sources/Pages/Page.php(1245): IPS\Theme\content_pages_6()
#3 /var/www/hooligun/data/www//applications/cms/sources/Pages/Page.php(2271): IPS\cms\Pages\_Page->getHtmlContent()
#4 /var/www/hooligun/data/www/applications/cms/modules/front/pages/page.php(116): IPS\cms\Pages\_Page->output()
#5 /var/www/hooligun/data/www/applications/cms/modules/front/pages/page.php(43): IPS\cms\modules\front\pages\_page->view()
#6 /var/www/hooligun/data/www/system/Dispatcher/Controller.php(101): IPS\cms\modules\front\pages\_page->manage()
#7 /var/www/hooligun/data/www/applications/cms/modules/front/pages/page.php(33): IPS\Dispatcher\_Controller->execute()
#8 /var/www/hooligun/data/www//system/Dispatcher/Dispatcher.php(153): IPS\cms\modules\front\pages\_page->execute()
#9 /var/www/hooligun/data/www//index.php(13): IPS\_Dispatcher->run()
#10 {main}

или другой пример

$nick = "NNmaaqqw{{{WWW}}QWDDD2";

Лог

ParseError: syntax error, unexpected '$return' (T_VARIABLE) in /var/www/hooligun/data/www/system/Theme/Theme.php(4495) : eval()'d code:18
Stack trace:
#0 /var/www/hooligun/data/www/applications/cms/sources/Blocks/Block.php(209): IPS\_Theme::runProcessFunction('\tfunction conte...', 'content_blocks_...')

ну и последний

$nick = "-{$ Maksim $}-";

лог

ParseError: syntax error, unexpected 'Maksim' (T_STRING), expecting variable (T_VARIABLE) or '{' or '$' in /var/www/hooligun/data/www/system/Theme/Theme.php(4495) : eval()'d code:17
Stack trace:

Пробовал: quotemeta , htmlspecialchars и addslashes - не помогает

Раньше помогало mysql_real_escape_string, но в php 7 этого нет.

Как сделать, чтобы IPS не читала эти символы?

Самое обидное, что если при открытии этой страницы с ошибкой, она уходит в кеш, и потом вообще не открывается, даже если ошибки уже нет. Приходится чистить кеш, и тогда страница начинает открываться, пока снова не наткнется на ошибку.

Поделиться сообщением


Ссылка на сообщение

Приветствую.

Вы делаете запросы к базе данных на уровне шаблонов стиля/блоков?

Лучше всего создать под это дело плагин, или создать блок php в Pages, вынести в него весь код с базой данных, а данные записывать в Data Store, а где нужно вывести переменные, подключить этот блок и обратиться к записанной переменной в Data Store. 

Поделиться сообщением


Ссылка на сообщение
2 часа назад, Lesovsky сказал:

Вы делаете запросы к базе данных на уровне шаблонов стиля/блоков?

Да, весь код в блоке.

С плагинами, к сожалению, я еще не разобрался..

Дело в том, что содержимое страницы у меня динамическое, зависит от GET параметра. Записывать данные в базу, а затем вытягивать, вроде как бесполезно.

Попробовал сделать так

\IPS\Data\Store::i()->ban_name = $name;
$name = \IPS\Data\Store::i()->ban_name;

Не помогло, всё равно ошибку выдает, как и ранее

Поделиться сообщением


Ссылка на сообщение
17 часов назад, HooLIGUN сказал:

$nick = "-{$ Maksim $}-";

Двойные кавычки нужно заменить на одинарные.

image.png

Поделиться сообщением


Ссылка на сообщение
10/24/21 08:51 (изменено)
$nick = "-{$ Maksim $}-";

Это для примера так показал

Значение $nick берется из БД

try
{
$data = $connection->select( '*', 'users','id ='.$id )->first();
}
catch( \UnderflowException $e )
{
	\IPS\Output::i()->error( 'ID не найден', '404', 404, '' );
}
$nick = $data['name']; // -{$ Maksim $}-

Поэтому тут кавычки уже роли не сыграют

Изменено пользователем HooLIGUN

Поделиться сообщением


Ссылка на сообщение
23.10.2021 в 13:13, HooLIGUN сказал:

Раньше помогало mysql_real_escape_string, но в php 7 этого нет.

Можно пример кода как было раньше, а то я не совсем понимаю о чем речь.
Если данные выводятся из бд, то по идее они никак не должны влиять на компиляцию шаблона.

  • Like 1

Поделиться сообщением


Ссылка на сообщение
13 часов назад, siv1987 сказал:

Можно пример кода как было раньше, а то я не совсем понимаю о чем речь.
Если данные выводятся из бд, то по идее они никак не должны влиять на компиляцию шаблона.

$nick = mysql_real_escape_string($nick);

Данные из БД, но вот почему то ломают.

Если убираю вывод переменной на странице проблемного ника, то страница запускается. т.е. проблема именно в этом

Поделиться сообщением


Ссылка на сообщение
26.10.2021 в 12:24, HooLIGUN сказал:

$nick = mysql_real_escape_string($nick);

Ну аналог этой функции в объектном стиле является real_escape_string - \IPS\Db::i()->real_escape_string( $nick )
В этом случае и addslashes должна была справится. Может быть тогда попробовать вручную их экранировать через preg_replace или str_replace

 

  • Like 1

Поделиться сообщением


Ссылка на сообщение

К сожалению, решения так и не нашел.

Прилагаю полностью проблемный код, который можно протестировать.

Есть отдельная база, в ней таблица users со столбцами id и nick

image.png.77bcf0807cda7b4cc097826a4a27f6ae.png

Создал блок с кодом и вставил в страницу

$connection = \IPS\Db::i( 'external', array(
    'sql_host'        => 'localhost',
    'sql_user'        => 'user',
    'sql_pass'        => 'pass',
    'sql_database'    => 'db',
    'sql_port'        => 3306,
   # 'sql_socket'    => '/var/lib/mysql.sock',
    'sql_utf8mb4'    => true,
) );

try
{
	$data = $connection->select( '*', 'users','id = 2' )->first();
}
catch( \UnderflowException $e )
{
	\IPS\Output::i()->error( ' ID не найден', '404', 404, '' );
}

echo $data['nick'];

 

Так вот, если выбирать из базы id = 1 и id = 2 , то будет ошибка

image.png.b0a496453a695fb222d17cd8bffd91e5.png

Если выбрать id = 3 (нормальный ник, без $ и {{}}) то всё ок, выводит ник.

 

@siv1987 @newbie @Lesovsky

 

 

Поделиться сообщением


Ссылка на сообщение

Я не знаком с принципом работы этих блоках, но что будет если вместо echo сделать return?

Поделиться сообщением


Ссылка на сообщение
44 минуты назад, siv1987 сказал:

Я не знаком с принципом работы этих блоках, но что будет если вместо echo сделать return?

Ошибки нет, но и ничего не возвращается

Поделиться сообщением


Ссылка на сообщение

Пришлось использовать костыли..

function ips_fixname ($name)
{
	$name =  str_replace('{', '', $name);
	$name =  str_replace('}', '', $name);
	$name =  str_replace('$', '', $name);
	return $name;
}

Если вдруг у кого будут идеи лучше, прошу поделиться, буду рад услышать

Поделиться сообщением


Ссылка на сообщение

Все верно, результат php кода в дальнейшем исполняется как шаблон, поэтому такие макросы как {$var} вызывают ошибки.

Как вариант, можно заменить доллар и фигурные скобки на html аналоги.

$name = str_replace( ['{', '}', '$'], ['{', '}', '$'], htmlspecialchars( $name ) );
  • Like 1

Поделиться сообщением


Ссылка на сообщение

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.

×
×
  • Создать...