Jevix

Это замечательная система фильтрации и типографирования, Разработанная в Тематических Медиа для собственных проектов (в частности Хабрахабр), которая позволяет решить вопрос с фильтраций контента.
Она поможет образумить криворукого менеджера или злого скрипт-кидди, распихивающего везде XSS.

Возникла надобность в таком компоненте, поэтому я, долго не думая, воспользовался разработкой bezumkin . Чуть-чуть поправил и теперь можно использовать Jevix в Evo.

Параметры

  • configDir, defaultConfig — имя папки и файла с настройками по умолчанию (assets/snippets/Jevix/ и default);
  • options — json-массив с параметрами (по умолчанию пусто);
  • input — текст для обработки;
  • inputField — имя поля документа (подставить нахаляву &input=`[*content*]`, конечно, можно, но если в [*content*] есть, например, обратный апостроф, то вызов сниппета сломается);
  • cfgAllowTagParams, cfgAllowTags и т.п. — описано здесь: modstore.pro/packages/content/jevix#tab=properties

Указанные при вызове настройки перезаписывают соответствующие настройки по умолчанию.

Без DocLister не запустится, скачивать — github.com/Pathologic/Jevix

9 комментариев

avatar
А для ламеров можно больше инфы и примеров для чего это надо все? :)
avatar
Jevix — средство автоматического применения правил набора текстов, наделённое способностью унифицировать разметку HTML/XML документов, контролировать перечень допустимых тегов и аттрибутов, предотвращать возможные XSS-атаки в коде документов.
Чтобы пользователи не куролесили, когда публикуют тексты, особенно с фронтенда.
Комментарий отредактирован 2016-05-21 22:27:33 пользователем Pathologic
avatar
Багу на днях исправлю ;)
avatar
Не забудь добавить две новых :D
avatar
Вот плагин для примера (дополнительно заменяет сниппет alterTitle и экранирует значения полей):

/**
 * contentHelper
 * 
 * Plugin to prepare document output
 * 
 * @category 	plugin
 * @internal	@properties &escape=Fields to sanitize;textarea;meta-keywords,meta-description,pagetitle &contentProcessor=Snippet to process content field;text;Jevix &contentProcessorParams=Snippet parameters;textarea; &contentProcessorTemplates=Templates to process;text;
 * @internal	@events OnAfterLoadDocumentObject
**/
$e = &$modx->event;
if ($e->name == 'OnAfterLoadDocumentObject') {
	$documentObject['pagetitle'] = empty($documentObject['longtitle']) ? $documentObject['pagetitle'] : $documentObject['longtitle'];
	if (isset($escape)) {
		$fields = array_filter(explode(',',$escape));
		foreach ($fields as $field) {
			$field = trim($field);
			if (is_array($documentObject[$field])) {
				$documentObject['e.'.$field] = htmlspecialchars($documentObject[$field][1], ENT_QUOTES, 'UTF-8');
			} else {
				$documentObject['e.'.$field] = htmlspecialchars($documentObject[$field], ENT_QUOTES, 'UTF-8');
			}
		}
	}
	if (isset($contentProcessor)) {
		if (isset($contentProcessorTemplates)) {
			if (!in_array($documentObject['template'],explode(',',$contentProcessorTemplates))) return;
		}
		$content = &$documentObject['content'];
		$snippetParams = isset($contentProcessorParams) ? $modx->parseProperties($contentProcessorParams) : array();
		$snippetParams['input'] = $content;
		if ($_content = $modx->runSnippet($contentProcessor,$snippetParams)) $content = $_content;
	}
	$e->_output = $documentObject;
}


Для теста можно создать документ с указанным в настройках плагина шаблоном, отключить в документе редактор и вставить такое:

Обработано с помощью http://jevix.ru

<script>alert('Lol!');</script>

Вронский был хозяин губернии, торжественно открывавший выборы говоривший. Либеральных, новых деятелей и держит себя под уздцы, чтобы строго. Маслов катька, – конфузившийся пред. Провел время и вместе остроумных и более всего. Подумывал баллотироваться, – простые ровные. Дворянина и не подобающего той новой, либеральной среде. Неудачу весело провел время. Что, кроме этого шального господина. Неведовскому, что его сидел в учредивший процветающий банк в счастлив и землевладельца.

Корпусе, – такое было очень скоро заставившие. Другой шутливый дворянин рассказал. Этого шального господина, женатого на выборах за все довольны. Ним познакомиться. превосходительству придется отослать назад. Непоколебимым и весело провел время. Видел вронский; для всех это перебирались эпизоды выборов так заняло. Все было, вместе остроумных и теперь их придется отослать назад, если. Телеграмм людям, интересовавшимся ходом выборов так хорошо делать.

Так хорошо делать это суждение. Говорили: наш губернский предводитель не ожидал такого милого тона в кашине отличный. Это, что весело провел время и винами не подобающего той новой. Называют madame и торжествовало его сторонником винами. Знала, что успеху неведовского очень. Тоже полушутливые, и весело провел время обеда, обращаясь. Чем слезы, поверку сумм вроде того, чтобы строго исполнить. Избрать другую, более нейдущих глупостей, каждый дворянин.


C плагином и Jevix из документа будет при выводе вырезан скрипт, ссылка станет ссылкой, а переносы строк будут заменены на br — это с настройками Jevix по умолчанию. Обработка происходит один раз после очистки кэша.
avatar
Я бы все-таки это
$documentObject['pagetitle'] = empty($documentObject['longtitle']) ? $documentObject['pagetitle'] : $documentObject['longtitle'];
писал в отдельную переменную — например title, чтобы и pagetitle был доступен при необходимости :)
avatar
Да, пожалуй, так лучше будет.
avatar
Как вариант, можно даже использовать известный [*alterTitle*] :)
avatar
При повышении версии PHP с 7.2 до 7.3 сниппет перестал работать, пока откатил обратно до 7.2
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.