Pergunta

Eu quero permitir que os usuários coloque <embed> e <object> Fragmentos HTML (players de vídeo) através de um formulário HTML. O código do lado do servidor é PHP. Como posso proteger contra código colado malicioso, javascript etc.? Eu poderia analisar o código colado, mas não tenho certeza se poderia explicar todas as variações. Existe uma maneira melhor?

Foi útil?

Solução

Não tenho muita certeza de quais parâmetros EMBED e OBJECT Tome como eu nunca lidei com a mídia em uma página (o que é realmente chocante para pensar), mas eu adotaria uma abordagem de código BB e faria algo como [embed url="http://www.whatever.com/myvideo.whatever" ...] E então você pode analisar o URL e qualquer outra coisa, verifique se eles são legítimos e fazer o seu próprio <EMBED> marcação.

editar: Tudo bem, algo assim deve ficar bem:

$youtube = '<object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/Z75QSExE0jU&hl=en&fs=1"></param> </param><embed src="http://www.youtube.com/v/Z75QSExE0jU&hl=en&fs=1" type="application/x-shockwave-flash" allowfullscreen="true" width="425" height="344"></embed></object>';

$blip = '<embed src="http://blip.tv/play/AZ_iEoaIfA" type="application/x-shockwave-flash" width="640" height="510" allowscriptaccess="always" allowfullscreen="true"></embed>';

preg_match_all("/([A-Za-z]*)\=\"(.+?)\"/", $youtube, $matches1);
preg_match_all("/([A-Za-z]*)\=\"(.+?)\"/", $blip, $matches2);
print '<pre>' . print_r($matches1, true). '</pre>';
print '<pre>' . print_r($matches2, true). '</pre>';

Isso será lançado:

Array
(
[0] => Array
    (
        [0] => width="425"
        [1] => height="344"
        [2] => name="movie"
        [3] => value="http://www.youtube.com/v/Z75QSExE0jU&hl=en&fs=1"
        [4] => src="http://www.youtube.com/v/Z75QSExE0jU&hl=en&fs=1"
        [5] => type="application/x-shockwave-flash"
        [6] => allowfullscreen="true"
        [7] => width="425"
        [8] => height="344"
    )

[1] => Array
    (
        [0] => width
        [1] => height
        [2] => name
        [3] => value
        [4] => src
        [5] => type
        [6] => allowfullscreen
        [7] => width
        [8] => height
    )

[2] => Array
    (
        [0] => 425
        [1] => 344
        [2] => movie
        [3] => http://www.youtube.com/v/Z75QSExE0jU&hl=en&fs=1
        [4] => http://www.youtube.com/v/Z75QSExE0jU&hl=en&fs=1
        [5] => application/x-shockwave-flash
        [6] => true
        [7] => 425
        [8] => 344
    )
)

Array
(
[0] => Array
    (
        [0] => src="http://blip.tv/play/AZ_iEoaIfA"
        [1] => type="application/x-shockwave-flash"
        [2] => width="640"
        [3] => height="510"
        [4] => allowscriptaccess="always"
        [5] => allowfullscreen="true"
    )

[1] => Array
    (
        [0] => src
        [1] => type
        [2] => width
        [3] => height
        [4] => allowscriptaccess
        [5] => allowfullscreen
    )

[2] => Array
    (
        [0] => http://blip.tv/play/AZ_iEoaIfA
        [1] => application/x-shockwave-flash
        [2] => 640
        [3] => 510
        [4] => always
        [5] => true
    )
)

A partir de então, é bem direto. Para coisas como largura/altura, você pode verificá -las is_numeric E com o resto, você pode executar os valores htmlentities e construir o seu próprio <embed> tag da informação. Tenho certeza de que isso seria seguro. Você pode até fazer o pleno de pleno <object> Um como o YouTube (que suponho que trabalhe em mais lugares) com links do Blip.tv, pois você teria todos os dados necessários.

Tenho certeza de que você pode ver algumas peculiaridades com links de outros sites de compartilhamento de vídeo, mas isso espera que você inicie. Boa sorte.

Outras dicas

Suas chances de detectar código malicioso de maneira confiável, digitalizando HTML insumida, são sobre nulo. Existem tantas maneiras possíveis de injetar script (incluindo HTML malformado específico do navegador), você não poderá escolhê-los. Se os grandes provedores de webmail ainda estiverem depois de anos encontrando novas façanhas, não há chance de você poder fazê -lo.

A lista de permissões é melhor do que a lista negra. Portanto, você pode exigir que a entrada seja xhtml e analisá -la usando um analisador XML padrão. Em seguida, caminhe pelo DOM e verifique se cada um dos elementos e atributos é conhecido e, se estiver tudo bem, seriam de volta ao XHTML, que, proveniente de um DOM conhecido, não deve ser malformado. Um analisador XML adequado com suporte do Unicode também deve filtrar 'sequências UTF-8 abrangentes' (um orifício de segurança que afeta o IE6 e as óperas mais antigas) gratuitamente.

No entanto ... se você permitir incorporar/objetos de qualquer domínio, você já está permitindo o acesso completo ao script à sua página a partir de um domínio externo, portanto a injeção de HTML é a menor das suas preocupações. Os plug-ins como o Flash provavelmente poderão executar o JavaScript sem nenhum tipo de truque necessário.

Portanto, você deve limitar a fonte de objetos a domínios bem conhecidos. E se você já está fazendo isso, provavelmente é mais fácil permitir que o usuário escolha um provedor de vídeo e um ID do clipe e convertê-lo no código de incorporação de bom e conhecido para esse provedor. Por exemplo, se você estiver usando uma marcação do tipo BBCode, a maneira tradicional de permitir que os usuários incluam um clipe do YouTube seria algo [YouTube] dtzs7dsh [/youtube].

Aqui está um exemplo de código colado do blip.tv:

<embed src="http://blip.tv/play/AZ_iEoaIfA" type="application/x-shockwave-flash"    
  width="640" height="510" allowscriptaccess="always" allowfullscreen="true"></embed>

Aqui está um exemplo do que você pode obter do YouTube:

<object width="425" height="344">
  <param name="movie" value="http://www.youtube.com/v/Z75QSExE0jU&hl=en&fs=1"></param>
  <param name="allowFullScreen" value="true"></param>
    <embed src="http://www.youtube.com/v/Z75QSExE0jU&hl=en&fs=1"
      type="application/x-shockwave-flash" allowfullscreen="true"
      width="425" height="344"></embed>
</object>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top