Перейти к публикации
View in the app

A better way to browse. Learn more.

Дизайн и модификация Invision Community

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

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

Опубликовано:

Добрый день. Подскажите, как экранировать спец символы 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

Опубликовано:
  • Автор
$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 этого нет.

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

Опубликовано:
  • Автор
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

 

  • 4 недели спустя...
Опубликовано:
  • Автор

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

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

Есть отдельная база, в ней таблица 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 ) );

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

Сейчас на странице 0

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

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.