JavaScript eval () per analizzare JSON dopo aver disinfettato le espressioni regolari - XSS è possibile?

5

È possibile ignorare la mia regex ed eseguire JavaScript?

<script>      
  function json(a){

  if (/^\s*$/.test(a) ? 0 : /^[\],:{}\s\u2028\u2029]*$/.test(a.replace(/\["\\/bfnrtu]/g, "@").replace(/"[^"\\n\r\u2028\u2029\x00-\x08\x0a-\x1f]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]").replace(/(?:^|:|,)(?:[\s\u2028\u2029]*\[)+/g, ""))) 
    try{
         return eval("(" + a + ")")
    } catch (b) {}

    g(Error("Invalid JSON string: " + a))
  }

  json(window.name);    
</script>
    
posta LucasNN 06.02.2013 - 07:41
fonte

2 risposte

16

La mia reazione immediata a questo non è stata positiva, per alcuni motivi.

  1. Cercare di utilizzare espressioni regolari per analizzare complessi costrutti linguistici è una cattiva idea . Le espressioni regolari non sono adatte a tali costrutti.
  2. La sicurezza attraverso la lista nera è una cattiva idea perché sarai sempre, per definizione, un passo indietro rispetto agli attaccanti. Dovresti utilizzare un modello di sicurezza positivo .
  3. C'è un enorme numero di tecniche di evasione del filtro XSS che possono essere utilizzate in cima ai vettori standard. Non è possibile rilevarli e bloccarli tutti.
  4. L'analisi JavaScript di JSON tramite eval() è considerata una vulnerabilità di sicurezza .
  5. I browser moderni hanno supporto per il corretto parsing JSON nativo, tramite JSON.parse() e JSON.stringify() .
  6. Se devi supportare i vecchi browser, c'è una libreria JSON sicura che puoi usare che non usa eval() per la decodifica.

Tutto sommato, il tuo approccio regex è eccessivamente ingegnerizzato, insicuro, fuorviato e ridondante. Stai tentando di risolvere un problema che è già stato risolto. Non essere un Dave. Usa il file corretto JSON analizza le funzioni e le librerie disponibili per te.

    
risposta data 06.02.2013 - 13:34
fonte
4

questo (true");alert(9);//"

è molto vicino a un'istruzione javascript valida e sarà accettato nella tua espressione regolare.

Fai attenzione alla tua espressione regolare, qualcuno può ignorarla.

    
risposta data 06.02.2013 - 07:47
fonte

Leggi altre domande sui tag