HooLIGUN 10 10/23/2021 10:13 AM Добрый день. Подскажите, как экранировать спец символы 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
Lesovsky 149 10/23/2021 01:43 PM Приветствую. Вы делаете запросы к базе данных на уровне шаблонов стиля/блоков? Лучше всего создать под это дело плагин, или создать блок php в Pages, вынести в него весь код с базой данных, а данные записывать в Data Store, а где нужно вывести переменные, подключить этот блок и обратиться к записанной переменной в Data Store. Share this post Link to post
HooLIGUN 10 10/23/2021 04:39 PM 2 часа назад, Lesovsky сказал: Вы делаете запросы к базе данных на уровне шаблонов стиля/блоков? Да, весь код в блоке. С плагинами, к сожалению, я еще не разобрался.. Дело в том, что содержимое страницы у меня динамическое, зависит от GET параметра. Записывать данные в базу, а затем вытягивать, вроде как бесполезно. Попробовал сделать так \IPS\Data\Store::i()->ban_name = $name; $name = \IPS\Data\Store::i()->ban_name; Не помогло, всё равно ошибку выдает, как и ранее Share this post Link to post
Lesovsky 149 10/24/2021 04:08 AM 17 часов назад, HooLIGUN сказал: $nick = "-{$ Maksim $}-"; Двойные кавычки нужно заменить на одинарные. Share this post Link to post
HooLIGUN 10 10/24/2021 08:51 AM (edited) $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 October 24, 2021 by HooLIGUN Share this post Link to post
siv1987 2,623 10/25/2021 07:52 PM 23.10.2021 в 13:13, HooLIGUN сказал: Раньше помогало mysql_real_escape_string, но в php 7 этого нет. Можно пример кода как было раньше, а то я не совсем понимаю о чем речь. Если данные выводятся из бд, то по идее они никак не должны влиять на компиляцию шаблона. 1 Share this post Link to post
HooLIGUN 10 10/26/2021 09:24 AM 13 часов назад, siv1987 сказал: Можно пример кода как было раньше, а то я не совсем понимаю о чем речь. Если данные выводятся из бд, то по идее они никак не должны влиять на компиляцию шаблона. $nick = mysql_real_escape_string($nick); Данные из БД, но вот почему то ломают. Если убираю вывод переменной на странице проблемного ника, то страница запускается. т.е. проблема именно в этом Share this post Link to post
siv1987 2,623 10/29/2021 01:10 PM 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 1 Share this post Link to post
HooLIGUN 10 11/25/2021 10:25 AM К сожалению, решения так и не нашел. Прилагаю полностью проблемный код, который можно протестировать. Есть отдельная база, в ней таблица users со столбцами id и nick Создал блок с кодом и вставил в страницу $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 , то будет ошибка Если выбрать id = 3 (нормальный ник, без $ и {{}}) то всё ок, выводит ник. @siv1987 @newbie @Lesovsky Share this post Link to post
siv1987 2,623 11/25/2021 02:21 PM Я не знаком с принципом работы этих блоках, но что будет если вместо echo сделать return? Share this post Link to post
HooLIGUN 10 11/25/2021 03:05 PM 44 минуты назад, siv1987 сказал: Я не знаком с принципом работы этих блоках, но что будет если вместо echo сделать return? Ошибки нет, но и ничего не возвращается Share this post Link to post
HooLIGUN 10 11/26/2021 10:57 AM Пришлось использовать костыли.. function ips_fixname ($name) { $name = str_replace('{', '', $name); $name = str_replace('}', '', $name); $name = str_replace('$', '', $name); return $name; } Если вдруг у кого будут идеи лучше, прошу поделиться, буду рад услышать Share this post Link to post
siv1987 2,623 11/26/2021 07:52 PM Все верно, результат php кода в дальнейшем исполняется как шаблон, поэтому такие макросы как {$var} вызывают ошибки. Как вариант, можно заменить доллар и фигурные скобки на html аналоги. $name = str_replace( ['{', '}', '$'], ['{', '}', '$'], htmlspecialchars( $name ) ); 1 Share this post Link to post