Rincewind Posted April 1, 2011 Report Share Posted April 1, 2011 Tātad HTMLPurifier ar jauno Youtube embed formātu (iframe) strādāt nemāk. Uzrakstīju regexpus, viņi strādā korekti. Bet tā kā es viņos īsti nejēdzu, varbūt te ir ieviesusies kāda kļūda caur kuru mani ļauni hakeri uzreiz uzlauzīs? Divi preg_replace tur ir lai strādātu arī ar share linku. Pirmais pārveido iframe uz share linku, otrais share uz iframe. $from = '/\<iframe.+(http\:\/\/w{1,3}\.youtube\.com)\/embed\/(\w{11}).*\>.*\<\/iframe\>/'; $to = '<a href="\\1/watch?v=\\2"></a>'; $return = preg_replace($from, $to, $return); ŠEIT HTML PURIFIER MAGIC $from = '/<a href=\"http:\/\/(w{1,3}).youtube.com\/watch\?v=(\w{11})\"\>.*<\/a>/'; $to = '<iframe title="YouTube video player" width="445" height="280" src="http://www.youtube.com/embed/\\2?rel=0" frameborder="0" allowfullscreen></iframe>'; $return = preg_replace($from, $to, $return); Quote Link to comment Share on other sites More sharing options...
codez Posted April 2, 2011 Report Share Posted April 2, 2011 (edited) Ja nemaldos, tad HTML purifier var diezgan plaši konfigurēt un domāju, ka var viegli uzrakstīt, lai viņš atļauj ifreimus no youtubes. P.S. šeit ir topiks, kurā ir links uz git branch-u ar divām jaunām opcijām: HTML.SafeIframe / bool, default: FALSE - atļaut ifreimus URI.IframeHostWhitelist / list, default: array() - kādos domeinos atļaut ifreimus. Saliec atļautos domeinus un ieliec true un visam vajadzētu strādāt. Edited April 2, 2011 by codez Quote Link to comment Share on other sites More sharing options...
Rincewind Posted April 2, 2011 Author Report Share Posted April 2, 2011 (edited) šeit ir topiks, kurā ir links uz git branch-u ar divām jaunām opcijām: HTML.SafeIframe / bool, default: FALSE - atļaut ifreimus URI.IframeHostWhitelist / list, default: array() - kādos domeinos atļaut ifreimus. Viņš share linkus par Youtubes ifreimu arī pārveido? Vispār neoficiālus filtrus negribas īsti likt, tad jāseko līdz updeitiem un bugfixiem. Edited April 2, 2011 by Rincewind Quote Link to comment Share on other sites More sharing options...
codez Posted April 14, 2011 Report Share Posted April 14, 2011 (edited) Tā kā man vienam projektam arī vajadzēja jaunos youtube linkus un izmeklējot netu, tādu labu risinājumu neatradu, tad izveidoju savu risinājumu. HTML Purifiers ir plaši konfigurējams un viena no lietām, ko var konfigurēt ir iespēja pielikt klāt atļautos elementus un to atribūtus. Vienkāršākais veids kā atļaut ifreimus ir vienkārši pielikt iframe elementu ar atļautajiem atribūtiem. Problēma sākas tāpēc, ka mēs nevēlamies ļaut iframes src atļaut visus hostus, bet tikai noteiktus hostus, bet šādu filtrēšanas parametru HTML Purifiers defaultā neļauj. Tāpēc uzbūvēju savu attribūta definīcjas klasi ar papildus parametru, kura ekstendo esošo URI attrībuta klasi. class HTMLPurifier_AttrDef_URI_AllowedHosts extends HTMLPurifier_AttrDef_URI { protected $allowd_hosts; public function __construct($embeds_resource = false,$allowed_hosts=array()){ $this->allowed_hosts=$allowed_hosts; parent::__construct($embeds_resource); } public function validate($uri, $config, $context){ $p=parse_url($uri); if (!in_array($p['host'],$this->allowed_hosts)) {return false;} return parent::validate($uri, $config, $context); } } Tālāk jau viss kā pievienojot parastu elementu, tikai atļauto atribūtu definicijās, pie src atribūta izmantojam manu klasi, kurai ir papildus parametrs - masīvs ar atļautajiem hostiem. $def = $config->getHTMLDefinition(true); $iframe = $def->addElement('iframe','Inline','Empty','Common', array( 'src*'=>new HTMLPurifier_AttrDef_URI_AllowedHosts(false,array('www.youtube.com','youtube.com','maps.google.com')), 'width'=>'Pixels#800', 'height'=>'Pixels#600', 'frameborder'=>'Number', 'name'=>'ID' ) ); Kā redzams HTMLPurifier_AttrDef_URI_AllowedHosts kodā, tad pirms extendotās klases validate izsaukšanas es vienkārši nopārsēju $uri un pārbaudu vai hosts ir masīvā. Šo klasi var mierīgu uzlabot, lai masīvā var rakstīt regexpus, lai varētu universālāk definēt atļautos src. Edited April 14, 2011 by codez Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.