Jump to content
php.lv forumi

preg_replace, HTMLPurifier un YouTube


Rincewind

Recommended Posts

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);

Link to comment
Share on other sites

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 by codez
Link to comment
Share on other sites

š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 by Rincewind
Link to comment
Share on other sites

  • 2 weeks later...

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 by codez
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...