2010-03-03 2 views
33

ho una riga di codice che ottiene il seguente errore quando eseguito attraverso JSLint:Scopo del JSLint "non consentire insicuro in regex" opzione

Lint at line 604 character 48: Insecure '^'. 
numExp = parseInt(val[1].replace(/[^\-+\d]/g, ""), 10); 

Questo errore sembra riferirsi alla seguente descrizione dalla pagina delle opzioni di JSLint:

"true if . and [^...] should not be allowed in RegExp literals. 
These forms should not be used when validating in secure applications." 

Non capisco come un'applicazione javascript lato client possa davvero essere considerata sicura. Anche con la regex più ermetica, è comunque possibile attivare qualcosa come firebug e cambiare la variabile comunque. La convalida dell'input reale dovrebbe essere eseguita sul server e il browser client dovrebbe probabilmente contenere la convalida che gestirà l'abuso dell'utente medio.

È possibile ignorare questo errore? Mi manca un angolo qui dove la mia applicazione sarà insicura a causa della convalida dell'input lato client?

risposta

30

"Insecure" significa "non specifico" in questo contesto. Sia il punto . sia l'intervallo esclusivo non definiscono chiaramente che deve corrispondere alla regex con. A scopo di validazione, questo può proporre il rischio di abbinare con successo cose che non avevate pensato e non volete (pensate: white-listing vs. black-listing).

In ogni caso, il punto e l'intervallo esclusivo sono parti valide di un'espressione regolare e, se fanno ciò che è necessario (come in questo caso), penserei che l'avviso sia troppo prudente.

Un utente malintenzionato può interferire con la logica della pagina in qualsiasi momento; l'avvertimento riguarda più il normale funzionamento della pagina.

14

Tutto sta cercando di dirti è che è generalmente meglio specificare che cosa può essere inserito al posto di ciò che non può .

In questo caso, la regex sta effettivamente eliminando i caratteri non validi, quindi è possibile ignorare l'avviso.