Domanda

ho incontrato un po 'di un problema con un Regex che sto utilizzando per i nomi umani.

$rexName = '/^[a-z' -]$/i';

Supponiamo che un utente con il nome Jürgen desidera registrare? O Bob? Questo è abbastanza comune in Europa. C'è una notazione speciale per questo?

EDIT :, appena gettato il nome Jürgen contro un creatore regex, e divide la parola fino alla lettera U ...

http://www.txt2re.com/ index.php3? s = J% FCrgen + Blalock & submit = Visualizza + Risultati

EDIT2: Allright, dal momento che il controllo per tali cose specifiche è difficile, perché non utilizzare una regex che controlla semplicemente per caratteri non validi

?
$rexSafety = "/^[^<,\"@/{}()*$%?=>:|;#]*$/i";

(ora quali di questi possono effettivamente essere utilizzati in qualsiasi tentativo di attacco?)

Per esempio. Questo permette 'e - segni, ma è necessario un; per farlo funzionare in SQL, e quelli saranno stopped.Any altri personaggi che sono comunemente usati per l'iniezione HTML di attacchi SQL che mi manca?

È stato utile?

Soluzione

Vorrei davvero dire: non cercare di convalidare nomi: un giorno o l'altro, il codice si riunirà un nome che si pensa sia "sbagliato" ... E come pensi che si potrebbe reagire quando un'applicazione gli dice " il tuo nome non è valido "?

A seconda di ciò che si vuole veramente raggiungere, si potrebbe considerare l'utilizzo di una sorta di lista nera / filtri, per escludere i "non-nomi" hai pensato: sarà forse lasciare che alcuni "cattivi-nomi" passano, ma, a almeno, non dovrebbe impedire qualsiasi nome esistente di accedere alla vostra applicazione.

Ecco alcuni esempi di regole che vengono in mente:

  • nessun numero
  • nessun carattere speciale, come "~{()}@^$%?;:/*§£ø e probabilmente alcuni altri
  • non più di 3 spazi?
  • nessuna delle "admin", "supporto", "moderatore", "test", e pochi altri non-nomi evidenti che le persone tendono a usare quando non vogliono di digitare il loro vero nome ...
    • (ma, se non vogliono dare il loro nome, la loro ancora non saranno, anche se li si proibisce di digitare alcune lettere casuali, si potrebbe utilizzare un nome vero e proprio ... che non è loro di)

Sì, questo non è perfetto; e sì, vi permetterà alcuni non-nomi passano ... ma probabilmente è il modo migliore per la vostra applicazione che dire a qualcuno "il tuo nome è sbagliato" (sì, insisto ^^)


E, per rispondere a un commento che hai lasciato in un altra risposta:

  

ho potuto solo vietare la più comandi   caratteri per SQL injection e XSS   attacchi,

A proposito di SQL Injection, si deve sfuggire i vostri dati prima di inviarli quelli al database; e, se a fuggire sempre tali dati (! si dovrebbe), è non c'è bisogno di preoccuparsi di ciò che gli utenti possono in ingresso oppure no:. come è sfuggito, sempre, non v'è alcun rischio per voi

Same su XSS: come sfuggire sempre i dati quando ouputting esso (! Si dovrebbe), non v'è alcun rischio di iniezione; -)


Modifica se si utilizza che regex così, non funziona abbastanza bene:

Il seguente codice:

$rexSafety = "/^[^<,\"@/{}()*$%?=>:|;#]*$/i";
if (preg_match($rexSafety, 'martin')) {
    var_dump('bad name');
} else {
    var_dump('ok');
}

ti porterà almeno un avvertimento:

Warning: preg_match() [function.preg-match]: Unknown modifier '{'

È necessario sfuggire, almeno alcuni di questi caratteri speciali; Ti farò scava nel PCRE Patterns per maggiori informazioni (c'è è davvero un sacco di conoscere PCRE / regex, e non sarà in grado di spiegare tutto)

Se si vuole realmente controllare che nessuno di questi personaggi è all'interno di una determinata parte dei dati, si potrebbe finire con qualcosa di simile:

$rexSafety = "/[\^<,\"@\/\{\}\(\)\*\$%\?=>:\|;#]+/i";
if (preg_match($rexSafety, 'martin')) {
    var_dump('bad name');
} else {
    var_dump('ok');
}

(Questa è una proposta rapida e sporca, che deve essere raffinato!)

Questo dice "OK" (beh, sicuramente spero il mio nome è ok!)
E lo stesso esempio con alcune offerte speciali caratteri, in questo modo:

$rexSafety = "/[\^<,\"@\/\{\}\(\)\*\$%\?=>:\|;#]+/i";
if (preg_match($rexSafety, 'ma{rtin')) {
    var_dump('bad name');
} else {
    var_dump('ok');
}

dirà "cattiva reputazione"

Ma si prega di notare che ho non completamente testato questo, e probabilmente ha bisogno di più lavoro! Non utilizzare questo sul tuo sito a meno che non l'avete provato con molta attenzione!


Si noti inoltre che una singola citazione può essere utile quando si cerca di fare un'iniezione SQL ... Ma probabilmente è un personaggio che è legale in alcuni nomi ... Così, proprio escludendo alcuni caratteri potrebbe non essere sufficiente; -)

Altri suggerimenti

supporti di implementazione PCRE di PHP proprietà dei caratteri Unicode quel lasso di un insieme più ampio di caratteri. Così si potrebbe utilizzare una combinazione di \p{L} (caratteri lettera), \p{P} (caratteri di punteggiatura) e \p{Zs} (caratteri di separazione spazio):

/^[\p{L}\p{P}\p{Zs}]+$/

Ma ci potrebbero essere personaggi che non sono coperti da queste categorie di caratteri, mentre ci potrebbe essere qualche compresi che non si desidera per essere ammessi.

Quindi vi consiglio di non usare le espressioni regolari su un dato con una gamma così vaga di valori come il nome di una persona reale.


Modifica Come hai modificato la tua domanda e ora vedere che si desidera solo per prevenire alcuni attacchi di iniezione di codice:. Si dovrebbe meglio scappare quei personaggi piuttosto che rifiutarle come un potenziale tentativo di attacco di

mysql_real_escape_string o istruzioni preparate per le query SQL, htmlspecialchars per l'output HTML e altre funzioni appropriate per le altre lingue.

Questo è un problema senza soluzione generale facile. Il fatto è che davvero non si può prevedere cosa caratteri un nome potrebbe contenere. Probabilmente la soluzione migliore è quella di definire una maschera di carattere negativo di escludere alcuni caratteri speciali che davvero non si vuole finire in un nome.

È possibile farlo utilizzando:

$ regexp = "/ ^ [ ^ ] + $ /

Se si sta cercando di analizzare a parte un nome umano in PHP, io vi consiglio di Keith Beckman sceneggiatura nameparse.php .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top