Jump to content
Дизайн и модификация IPS Community IPBSkinsBETA
Search In
  • More options...
Find results that contain...
Find results in...
Sign in to follow this  
HooLIGUN

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

Recommended Posts

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

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites
2 часа назад, Lesovsky сказал:

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

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

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

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

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

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

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

Share this post


Link to post
Share on other sites
17 часов назад, HooLIGUN сказал:

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

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

image.png

Share this post


Link to post
Share on other sites
$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 $}-

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

Edited by HooLIGUN

Share this post


Link to post
Share on other sites
23.10.2021 в 13:13, HooLIGUN сказал:

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

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

  • Like 1

Share this post


Link to post
Share on other sites
13 часов назад, siv1987 сказал:

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

$nick = mysql_real_escape_string($nick);

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

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

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites

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

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

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

 

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
44 минуты назад, siv1987 сказал:

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

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...