Domanda

Voglio consentire agli utenti di incollare < embed > e < object > frammenti HTML (lettori video) tramite un modulo HTML. Il codice lato server è PHP. Come posso proteggere da codice incollato malevolo, JavaScript, ecc.? Potrei analizzare il codice incollato, ma non sono sicuro di poter tenere conto di tutte le varianti. C'è un modo migliore?

È stato utile?

Soluzione

Non sono davvero sicuro di quali parametri siano EMBED e OBJECT dato che non ho mai avuto a che fare con l'inserimento di contenuti multimediali in una pagina (che in realtà è abbastanza scioccante per pensaci) ma adotterò un approccio al codice BB e farei qualcosa come [embed url = " http: //www.whatever.com/myvideo.whatever" ...] e quindi puoi analizzare l'URL e qualsiasi altra cosa, assicurarti che siano legittimi e crea il tuo tag < EMBED > .

modifica: Va bene, qualcosa del genere dovrebbe andare bene:

$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>';

Questo produrrà:

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

Da quel momento in poi è piuttosto semplice. Per cose come larghezza / altezza puoi verificarle con is_numeric e con il resto puoi eseguire i valori attraverso htmlentities e costruire il tuo < incorpora il tag > dalle informazioni. Sono abbastanza sicuro che questo sarebbe sicuro. Puoi persino rendere < object > a tutti gli effetti uno come YouTube (che presumo funzioni in più punti) con collegamenti da blip.tv, dato che avresti tutti i dati richiesti.

Sono sicuro che potresti vedere alcune stranezze con collegamenti da altri siti Web di condivisione video, ma spero che questo ti possa iniziare. Buona fortuna.

Altri suggerimenti

Le tue possibilità di rilevare il codice dannoso in modo affidabile scansionando il codice HTML inserito sono quasi nulle. Esistono molti modi possibili per iniettare script (incluso HTML non valido specifico del browser), che non sarai in grado di sceglierli tutti. Se i grandi provider di webmail continuano a trovare nuovi exploit dopo anni, non c'è alcuna possibilità che tu possa farlo.

La whitelisting è meglio della blacklist. Quindi potresti invece richiedere che l'input sia XHTML e analizzarlo utilizzando un parser XML standard. Quindi attraversare il DOM e verificare che ciascuno degli elementi e degli attributi sia noto, e se tutto è a posto, serializzare nuovamente su XHTML, che, proveniente da un DOM noto, non deve essere malformato. Un corretto parser XML con supporto Unicode dovrebbe anche filtrare gratuitamente le brutte "sequenze UTF-8 troppo lunghe" (una falla di sicurezza che colpisce IE6 e le opere precedenti).

Tuttavia ... se si consente l'incorporamento / oggetti da qualsiasi dominio, si sta già consentendo l'accesso completo agli script alla propria pagina da domini esterni, quindi l'iniezione HTML è l'ultima preoccupazione. È probabile che plug-in come Flash siano in grado di eseguire JavaScript senza che sia necessario alcun tipo di inganno.

Quindi dovresti limitare la fonte degli oggetti a domini predefiniti noti. E se lo stai già facendo, è probabilmente più semplice consentire all'utente di scegliere un provider video e un ID clip, quindi convertirlo nel codice di incorporamento corretto e noto per quel provider. Ad esempio, se si utilizza un markup simile a bbcode, il modo tradizionale per consentire agli utenti di includere una clip di YouTube sarebbe qualcosa [youtube] Dtzs7DSh [/ youtube].

Ecco un esempio di codice incollato da blip.tv:

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

Ecco un esempio di ciò che potresti ottenere da 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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top