HTML рд╢реЛрдзрдХ рдЕрд╡рд╕рд░реЛрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░


рдХреЗрд╡рд▓ рдХреБрдЫ рдкреИрд░рд╛рдЧреНрд░рд╛рдлреЛрдВ рдореЗрдВ, рдореИрдВ рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ Yii рдврд╛рдВрдЪреЗ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдкрд░ рдзреНрдпрд╛рди рджреВрдВрдЧрд╛, рдмрд╛рдХреА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╣реИ рдФрд░ рдЙрди рд╕рднреА рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрдЧрд╛ рдЬреЛ рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдпрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

рдпрджрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╢реЛрдзрдХ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ, рддреЛ рдЖрдк рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдпрд╣рд╛рдВ рд╕реЗ рдкрдврд╝рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

HTML рд╢реЛрдзрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рд╛

рдпрджрд┐ рдЖрдкрдиреЗ HTML рдкреНрдпреВрд░рд┐рдлрд╛рдпрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕реБрдВрджрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп (рдФрд░ рд╣реИрдмреЗрд░реА рдкрд░ рдПрдХ рдЦреЛрдЬ рдЗрддрдиреА рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рдХреА рдмрд╛рдд рдирд╣реАрдВ) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реБрдирд╛ рд╣реИ, рддреЛ рдореИрдВ рдЖрдкрдХреЛ рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдЗрд╕ рдкрд░ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ, рдЦрд╛рд╕рдХрд░ рдпрджрд┐ рдЖрдкрдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ HTML рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╕рд╛рдордЧреНрд░реА рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛, рдПрдХ рдордзреНрдпрд╕реНрде рдпрд╛ рдПрдХ рдкреНрд░рд╢рд╛рд╕рдХ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИ?
рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдпрд╣ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рд╕рд╣рд┐рдд рдХреЛрдб рдХреЗ рд╕рднреА рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрдг, рдЕрдорд╛рдиреНрдп, рдирд┐рд╖рд┐рджреНрдз (рдЖрдкрдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рджреНрд╡рд╛рд░рд╛) рднрд╛рдЧреЛрдВ рдХреЗ рдХрд┐рд╕реА рднреА HTML рдХреЛрдб рдХреЛ рд╕рд╛рдлрд╝ рдХрд░рддрд╛ рд╣реИред

рдХрдо рд╢рдмреНрдж, рдЕрдзрд┐рдХ рдХреЛрдбред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рдЦреБрдж рдХреЗ рд▓рд┐рдП рдмреЛрд▓реЗрдВрдЧреЗред
$config = HTMLPurifier_Config::createDefault(); $config->set('Attr.AllowedClasses',array('header')); //  Attr.ForbiddenClasses   CSS  $config->set('AutoFormat.AutoParagraph',true); //   <p>     $config->set('AutoFormat.RemoveEmpty',true); //   ,  * $config->set('HTML.Doctype','HTML 4.01 Strict'); //      <strike> $purifier = new HTMLPurifier($config); $clean_html = $purifier->purify($html); 

* - RemoveEmpty рдЕрдкрд╡рд╛рдж

рд╕реНрд░реЛрдд HTML:
  <p invalidAttribute="value">,    <strike></strike>:</p> <p>  - <invalidTag></invalidTag>,</p> <p class="header error"> - ,</p>  - ! <script type="text/javascript">alert("hacked by Alexander Blok");</script> 

рд╢реБрджреНрдзрд┐рдХрд░рдг рдлрд╝рдВрдХреНрд╢рди рдкрд░рд┐рдгрд╛рдо
  <p>,    <span style="text-decoration:line-through;"></span>:</p> <p>  - ,</p> <p class="header"> - ,</p> <p> - !</p> 


рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рд╣реИ рдФрд░ рдЙрди рдмрдиреНрд╕ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддреА рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдмреЙрдХреНрд╕ рд╕реЗ рдЪрд╛рд╣рд┐рдПред


"рдкрд░реНрд▓ рдмрдЯрдиреНрд╕ рдХреА рдорд╛рдБ"

рд▓реЗрдХрд┐рди рдпрд╣ рдкрдж рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдпрджрд┐ рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рд╣рдо рджреЛ рдЪреАрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╡рд┐рд╢реЗрд╖ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рдереЗ:
  1. рдмрд╛рд╣рд░реА рд╕рд╛рдЗрдЯреЛрдВ рдХреЗ рд╕рднреА рд▓рд┐рдВрдХ рдХреЛ рд╣рдорд╛рд░реА рд╕рд╛рдЗрдЯ рдХреЗ рд▓рд┐рдВрдХ рдХреЗ рд╕рд╛рде рдмрджрд▓реЗрдВ site.ru/redirect?url=link
  2. рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд▓рд┐рдВрдХ рдкрд░ рд▓рдХреНрд╖реНрдп = _blank рд╡рд┐рд╢реЗрд╖рддрд╛ рдЬреЛрдбрд╝реЗрдВ

рдХрд╛рд░реНрдп рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд▓рдЧрддреЗ рд╣реИрдВ, рдкрд╣рд▓реЗ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдбреЙрдХ рдкрд░ рдПрдХ рдЕрдЪреНрдЫрд╛ рд▓реЗрдЦ рд╣реИ , рдФрд░ рджреВрд╕рд░рд╛ рдЖрдо рддреМрд░ рдкрд░ рдЯреНрд░рд┐рдлрд╝реНрд▓рд┐рдВрдЧ рд╣реИ - рдПрдЪрдЯреАрдПрдордПрд▓ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рдиред рд▓рдХреНрд╖реНрдпрдмреИрдВрдХ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдХрд╛рд░реНрдп 1 - рдмрд╛рд╣рд░реА рд▓рд┐рдВрдХ рдХреА рдЬрдЧрд╣

рд╢реЛрдзрдХ рдХреЗ рдкрд╛рд╕ рдПрдХ рдЕрджреНрднреБрдд рд╢реНрд░реЗрдгреА рдХрд╛ HTMLPurifier_URIFilter рд╣реИ рдФрд░ рдЗрд╕ рдлрд╝рд┐рд▓реНрдЯрд░ рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдХрдо рдЕрджреНрднреБрдд рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рд╣реИ
рдореИрдВрдиреЗ DisableExternalResources рдлрд╝рд╛рдЗрд▓ рдХреЛ рдПрдХ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдпрд╛ рдФрд░ рдЕрдкрдиреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдлрд┐рдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рддреБрд░рдВрдд рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛, рдЕрд░реНрдерд╛рддреН рдмрд╛рд╣рд░реА рд▓рд┐рдВрдХ рдХреЛ рдЖрдВрддрд░рд┐рдХ рдХреЗ рд╕рд╛рде рдмрджрд▓ рджрд┐рдпрд╛ред
рдлрд╝рд┐рд▓реНрдЯрд░ рдлрд╝рд╛рдЗрд▓
рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╡рд┐рд╡рд░рдг:
рддреИрдпрд╛рд░ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рд╣рдо рдЕрдкрдиреА рд╕рд╛рдЗрдЯ рдХреЗ рдореЗрдЬрдмрд╛рди рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдЕрдВрдХреЛрдВ рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд╕рд░рдгреА рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред
рдирддреАрдЬрддрди, рдпрд╣ рд╕рд░рдгреА ('рдЖрд░рдпреВ', 'рд╕рд╛рдЗрдЯ', 'рд╕рдмрдбреЛрдореЗрди') рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рдлрд╝рд┐рд▓реНрдЯрд░ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд▓рд┐рдВрдХ рдХреЗ рд╕рд╛рде рднреА рдРрд╕рд╛ рд╣реА рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╣реЛрд╕реНрдЯ рдХреА рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рдпрджрд┐ рдпрд╣ рд╕рдорд╛рди рд╣реИ, рддреЛ рдХреБрдЫ рднреА рди рдмрджрд▓реЗрдВ рдФрд░ рд╕рд╣реА рд▓реМрдЯреЗрдВ, рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рд╣рдорд╛рд░реЗ рдкрддреЗ рдХреЗ рд╕рд╛рде рдПрдХ рдирдпрд╛ рдпреВрдЖрд░рдЖрдИ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд▓рд┐рдВрдХ рдХреЛ рдЬреАрдИрдЯреА рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдбрд╛рд▓реЗрдВред
рдорд╣рддреНрд╡рдкреВрд░реНрдг рдлрд╝рд┐рд▓реНрдЯрд░ рд╡рд┐рдзрд┐ рдХреЛ рд╕рд╣реА рдпрд╛ рдЧрд▓рдд рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ рднреА рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓рд┐рдВрдХ рдХреЛ рд░рд┐рдЯрд░реНрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрджрд▓рдХрд░ рдмрджрд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рди рдХрд░реЗрдВред
 <?php class HTMLPurifier_URIFilter_MakeRedirect extends HTMLPurifier_URIFilter { /** * @type string */ public $name = 'MakeRedirect'; /** * @type array */ protected $ourHostParts = false; /** * @param HTMLPurifier_Config $config * @return void */ public function prepare($config) { $our_host = $config->getDefinition('URI')->host; if ($our_host !== null) { $this->ourHostParts = array_reverse(explode('.', $our_host)); } } /** * @param HTMLPurifier_URI $uri Reference * @param HTMLPurifier_Config $config * @param HTMLPurifier_Context $context * @return bool */ public function filter(&$uri, $config, $context) { if (is_null($uri->host)) { return true; } if ($this->ourHostParts === false) { return false; } $host_parts = array_reverse(explode('.', $uri->host)); foreach ($this->ourHostParts as $i => $x) { if (!isset($host_parts[$i]) || $host_parts[$i] != $this->ourHostParts[$i]) { $path = Yii::app()->createUrl('site/redirect'); //  Yii,      url manager       /action,    $query = 'url='.urlencode($uri->toString()); $uri = new HTMLPurifier_URI('http', null, Yii::app()->request->getServerName(), // return $_SERVER['SERVER_NAME'] null, $path, $query, null); break; } } return true; } } 


рдлрд╝рд┐рд▓реНрдЯрд░ рд▓рд╛рдЧреВ рдХрд░реЗрдВ

рдЗрд╕рдХреЗ рд▓рд┐рдП, рдЬреИрд╕рд╛ рдХрд┐ рдкреНрд░рд▓реЗрдЦрди рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ, рд╣рдореЗрдВ HTMLPurifier_Config рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЪрд╛рд▓реВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
  $config = HTMLPurifier_Config::createDefault(); $uri = $config->getDefinition('URI'); $uri->addFilter(new HTMLPurifier_URIFilter_MakeRedirect(), $config); $purifier = new HTMLPurifier($config); $clean_html = $purifier->purify($html); 

рдЦреБрд╢ Yii рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдЪреНрдЫреЗрдж

рдореИрдВ рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рд╣реВрдВ ( рдФрд░ рдореБрдЭреЗ рдХреЛрдИ рдкрдЫрддрд╛рд╡рд╛ рдирд╣реАрдВ рд╣реИ )ред рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ Yii рд╢реЛрдзрдХ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдм рдХреБрдЫ рдЗрддрдирд╛ рдЪрд┐рдХрдирд╛ рдирд╣реАрдВ рд╣реИред
рдкреНрд░рд▓реЗрдЦрди рд╕реЗ рдЙрджрд╛рд╣рд░рдг:
 $p = new CHtmlPurifier(); //   Yii $p->options = array('URI.AllowedSchemes'=>array('http' => true, 'https' => true,)); //      $text = $p->purify($text); 

рд╡рд╣рд╛рдБ рд╕реЗ рд╣рдо рд╕реАрдЦрддреЗ рд╣реИрдВ:
  /** * @var mixed the options to be passed to HTML Purifier instance. * This can be a HTMLPurifier_Config object, an array of directives (Namespace.Directive => Value) * or the filename of an ini file. * @see http://htmlpurifier.org/live/configdoc/plain.html */ private $_options=null; 

рд╕рдм рдХреБрдЫ рдареАрдХ рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рдЖрдк рдПрдХ рд╕рд░рдгреА рдХреЗ рдмрдЬрд╛рдп рдПрдХ HTMLPurifier_Config рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ:
  $purifier = new CHtmlPurifier(); $config = HTMLPurifier_Config::createDefault(); $config->set('AutoFormat.RemoveEmpty', true); $uri = $config->getDefinition('URI'); $uri->addFilter(new HTMLPurifier_URIFilter_MakeRedirect(), $config); $purifier->options = $config; $clean_html = $purifier->purify($html); 

  Warning Base directory /framework/vendors/htmlpurifier/standalone/HTMLPurifier/DefinitionCache/Serializer does not exist, please create or change using %Cache.SerializerPath 

рдпрд╣рд╛рдБ рд╣рдо рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдЧреЙрдЧрд▓ CHtmlPurifier рдорди рдореЗрдВ рдХреНрд░реЙрд▓ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВ рдХрд┐ Cache.SerializerPath рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ Yii :: app () -> getRitimePath () рдХреЗ рд╕рд╛рде рд╕реЗрдЯ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЗрд╕рд╕реЗ рдХреИрд╢ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдлрд╝реЛрд▓реНрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓реЗрдЧреАред
рд╣рдо рдХрд░рддреЗ рд╣реИрдВ:
 $purifier = new CHtmlPurifier(); $config = HTMLPurifier_Config::createDefault(); $config->set('AutoFormat.RemoveEmpty', true); $config->set('Cache.SerializerPath',Yii::app()->getRuntimePath()); // <-- $uri = $config->getDefinition('URI'); $uri->addFilter(new HTMLPurifier_URIFilter_MakeRedirect(), $config); $purifier->options = $config; $clean_html = $purifier->purify($html); 

 Cannot set directive after finalization invoked on line 127 in file /framework/web/widgets/CHtmlPurifier.php 

рдЕрдм рдкрд░реНрд╕рд░ рдХреЛ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдо рджреЛ рдмрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВред рдФрд░ CHtmlPurifier рдЗрд╕реЗ createNewHtmlPurifierInstance () рдореЗрдердб рдореЗрдВ рдХрд░рддрд╛ рд╣реИ
 protected function createNewHtmlPurifierInstance() { $this->_purifier=new HTMLPurifier($this->getOptions()); $this->_purifier->config->set('Cache.SerializerPath',Yii::app()->getRuntimePath()); return $this->_purifier; } 

рдпрд╣рд╛рдВ, рдореИрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВ, рдореИрдВрдиреЗ рдПрдХ рд╕реБрдВрджрд░ рд╕рдорд╛рдзрд╛рди рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рдмрд╣реБрдд рд╕рдордп рдмрд┐рддрд╛рдпрд╛, рд▓реЗрдХрд┐рди рдЕрдлрд╕реЛрд╕ред рдореБрдЭреЗ GHtmlPurifier class рдмрдирд╛рдиреЗ рдФрд░ CHNmlPurifier рд╡рд░реНрдЧ рдХреА рдУрд░ рд╕реЗ рдЗрд╕реЗ createNewHtmlPurifierInstance () рд╡рд┐рдзрд┐ рд╕реЗ рдЕрдзрд┐рд▓реЗрдЦрд┐рдд рдХрд░рдиреЗ рд╕реЗ рдЕрдзрд┐рдХ рд╕реБрдВрджрд░ рдХреБрдЫ рднреА рдирд╣реАрдВ рдорд┐рд▓рд╛ред
рдореИрдВрдиреЗ рдирдИ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд / рдШрдЯрдХреЛрдВ / рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд░рдЦрд╛ рдФрд░ рдХреЛрдб рдиреЗ рдЖрдЦрд┐рд░рдХрд╛рд░ рдХрд╛рдо рдХрд┐рдпрд╛ред
  $htmlpurifier = new GHtmlPurifier(); $config = HTMLPurifier_Config::createDefault(); $config->set('Cache.SerializerPath',Yii::app()->getRuntimePath()); $uri = $config->getDefinition('URI'); $uri->addFilter(new HTMLPurifier_URIFilter_MakeRedirect(), $config); $htmlpurifier->options = $config; return $htmlpurifier->purify($text); 

рдХрд╛рд░реНрдп 2 - рд▓рдХреНрд╖реНрдп рдЬреЛрдбрд╝рдирд╛ = _blank

рдореИрдВ рдЖрдкрдХреЛ рдЧреИрд░-рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреЛрдб рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рд╕реЗ рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ рдФрд░ рдореИрдВ рддреБрд░рдВрдд рдХрд╣реВрдВрдЧрд╛ рдХрд┐ HTML.TargetBlank рдХреЗрд╡рд▓ рдмрд╛рд╣рд░реА рд▓рд┐рдВрдХ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдЖрд╡реЗрджрди рдХреА рдЕрдм рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдФрд░ URI рдлрд╝рд┐рд▓реНрдЯрд░ рдЯреИрдЧ рдФрд░ рдЙрд╕рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдБрдЪ рд╕рдХрддреЗ рд╣реИрдВред
рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреБрд╕реНрддрдХрд╛рд▓рдп рдкрд░ рдЕрдЪреНрдЫреЗ рдкреНрд░рд▓реЗрдЦрди рдХреЗ рдЖрджреА, рд╡рд╣ рдореИрдирд╛ рдореЗрдВ рдЪрдврд╝ рдЧрдП, рд▓реЗрдХрд┐рди рдЕрдлрд╕реЛрд╕, рдЖрд╡рд╢реНрдпрдХ рдЙрдиреНрдирдд рдПрдкреАрдЖрдИ рдЕрдиреБрднрд╛рдЧ рдЦрд╛рд▓реА рдерд╛ рдФрд░ "рд╡рд┐рдХрд╛рд╕ рдХреЗ рддрд╣рдд рджрд╛рдпрд░" рд╢рд┐рд▓рд╛рд▓реЗрдЦ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ ред
рд╕реНрд░реЛрддреЛрдВ рдореЗрдВ рдбреБрдмрдХреА рд▓рдЧрд╛рдиреЗ рдФрд░ HTML.TargetBlank рдореЙрдбреНрдпреВрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рдЦреЛрдЬрдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ рдирд╣реАрдВ рдмрдЪрд╛ рдерд╛ред
рдпрд╣рд╛рдБ рдпрд╣ рд╣реИ:
HTMLPurifier_AttrTransform_TargetBlank
 /** * Adds target="blank" to all outbound links. This transform is * only attached if Attr.TargetBlank is TRUE. This works regardless * of whether or not Attr.AllowedFrameTargets */ class HTMLPurifier_AttrTransform_TargetBlank extends HTMLPurifier_AttrTransform { private $parser; public function __construct() { $this->parser = new HTMLPurifier_URIParser(); } public function transform($attr, $config, $context) { if (!isset($attr['href'])) { return $attr; } // XXX Kind of inefficient $url = $this->parser->parse($attr['href']); $scheme = $url->getSchemeObj($config, $context); if ($scheme->browsable && !$url->isBenign($config, $context)) { $attr['target'] = '_blank'; } return $attr; } } 


рд╣рдорд╛рд░рд╛ рдЕрдкрдирд╛ рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛, рдЬрд┐рд╕рдореЗрдВ рдмрд╛рд╣рд░реА рдкрддреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдЬреЛ рднреА рд▓рд┐рдВрдХ рдЖрдкрдХреЛ рдорд┐рд▓реЗрдВрдЧреЗ, рдЙрдирдореЗрдВ рд▓рдХреНрд╖реНрдп = _blank рдЬреЛрдбрд╝ рджреЗрдЧрд╛ред
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рд░ рдХреЛрдИ рдЯреНрд░рд╛рдВрд╕рдлрд╝реЙрд░реНрдорд┐рдВрдЧ рдкрджреНрдзрддрд┐ рдореЗрдВ рдПрдХ-рджреЛ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдХреЙрдкреА рдХрд░рдиреЗ рдФрд░ рдбрд┐рд▓реАрдЯ рдХрд░рдиреЗ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░реЗрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рд╕реВрдЪреА рдирд╣реАрдВ рджреВрдВрдЧрд╛ред рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдЕрдкрдиреЗ рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдирд╛рдо рдмрджрд▓рдирд╛ рди рднреВрд▓реЗрдВ, рдореИрдВрдиреЗ рдЗрд╕реЗ HTMLPurifier_AttrTransform_TargetBlankAll рдирд╛рдо рджрд┐рдпрд╛ рдФрд░ рдЗрд╕реЗ рдЙрд╕реА рдлрд╝реЛрд▓реНрдбрд░ / рд╕рдВрд░рдХреНрд╖рд┐рдд / рдШрдЯрдХреЛрдВ / рдореЗрдВ рдбрд╛рд▓ рджрд┐рдпрд╛ред
рд▓реЗрдХрд┐рди рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рдерд╛, рдореЙрдбреНрдпреВрд▓ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдЙрдард╛рддрд╛ рд╣реИ, рдФрд░ рд╣рдореЗрдВ рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╣рдорд╛рд░реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдЬреЛрдбрд╝ рджреЗрдЧрд╛ред рдХреЛрдб рдореЗрдВ, рдореИрдВрдиреЗ рдХреБрдЫ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рд╛ рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдерд╛ рдХрд┐ рдпрджрд┐ рдЖрдк рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдореЙрдбреНрдпреВрд▓ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ред
HTMLPurifier_HTMLModule_TargetBlankAll.php
 class HTMLPurifier_HTMLModule_TargetBlankAll extends HTMLPurifier_HTMLModule { public $name = 'TargetBlankAll'; //      .     public function setup($config) { $a = $this->addBlankElement('a'); // ,        A $a->attr_transform_post[] = new HTMLPurifier_AttrTransform_TargetBlankAll(); //       //      $a->attr_transform_pre[] } } 


рдореИрдВрдиреЗ рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ / рд╕рдВрд░рдХреНрд╖рд┐рдд / рдШрдЯрдХ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рднреА рд░рдЦрд╛ рд╣реИред
рдЕрдм рдпрд╣ рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдХреЛ рд╣рдорд╛рд░реЗ рд╡рд┐рдиреНрдпрд╛рд╕ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдЖрдирдВрдж рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИред рдпрд╣ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рддрд░реНрдХрд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реИред рд╣рдореЗрдВ HTML рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рд▓рд┐рдВрдХ рдорд┐рд▓рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рдкреИрд░рд╛рдореАрдЯрд░ $ рд░реЙ = рдЯреНрд░реВ рдХреЗ рд╕рд╛рде рд╣реЛ, рддрд╛рдХрд┐ рдпрд╣ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рд╣реЛ рдЬрд╛рдП рдФрд░ HTMLPurifier_HTMLDefinition рдХреНрд▓рд╛рд╕ рдореЗрдВ __construct () рд╡рд┐рдзрд┐ рдХрд╛рдо рдХрд░рддреА рд╣реИред
__Construct () рд╡рд┐рдзрд┐ $ рдЗрд╕-> рдореИрдиреЗрдЬрд░ рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддреА рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдо рдЕрдкрдиреЗ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВрдЧреЗред
  $htmlpurifier = new GHtmlPurifier(); $config = HTMLPurifier_Config::createDefault(); $config->set('Cache.SerializerPath',Yii::app()->getRuntimePath()); $uri = $config->getDefinition('URI'); $uri->addFilter(new HTMLPurifier_URIFilter_MakeRedirect(), $config); $html = $config->getHTMLDefinition(true); //     HTMLPurifier_HTMLDefinition $html->manager->addModule('TargetBlankAll'); //      $htmlpurifier->options = $config; return $htmlpurifier->purify($text); 

рддрд╛ рдмрд╛рдВрдз:
 <a href="http://site.ru/">http://site.ru</a> <a href="http://habrahabr.ru/">http://habrahabr.ru</a> 

 <a href="http://site.ru/" target="_blank">http://site.ru</a> <a href="http://site.ru/redirect/?url=http%3A%2F%2Fhabrahabr.ru%2F" target="_blank">http://habrahabr.ru</a> 

рджреЛрдиреЛрдВ рдХрд╛рд░реНрдп рдкреВрд░реЗ рд╣реБрдП!


рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЗрд╕ рд▓реЗрдЦ рдиреЗ рдЖрдкрдХреЛ рдЗрд╕ рдЕрджреНрднреБрдд рдЙрдкрдХрд░рдг рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдХрд░рд╛рдпрд╛ рдФрд░ рдЖрдкрдХреА рд╕рд╛рдЗрдЯ рдХреЛ рдЕрдзрд┐рдХ рд░реЛрдЪрдХ рдФрд░ рд╕реБрд░рдХреНрд╖рд┐рдд рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛, рдЕрдкрдиреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ HTML рдХреА рд╕рднреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рджрд┐рд▓рдЪрд╕реНрдк рд╕рд╛рдордЧреНрд░реА рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдХрд░реЗрдЧрд╛ред

рдпрд╣ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рддреЗрдЬрд╝ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрд╕реЗ рдлрд╝реНрд▓рд╛рдИ рдкрд░ рдбреЗрдЯрд╛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

Source: https://habr.com/ru/post/In202188/


All Articles