İnsan adları için PHP Regex

4 Cevap php

Ben insanların adları için kullanıyorum bir Regex ile bir sorun biraz çalıştırmak.

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

Jürgen kayıt istediği adıyla bir kullanıcı varsayalım? Veya bob? Avrupa'da oldukça yaygın bulunuyor. Bunun için özel bir gösterim var mı?

EDIT: sadece bir regex yaratıcının karşı Jürgen adını attı, ve ü harfi ile sözcük böler ...

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

EDIT2: Pekala, bu tür belirli şeyler için kontrol beri zor, neden sadece yasadışı karakterler denetleyen bir regex kullanmak değil mi?

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

(Şimdi ki bu olanlar aslında herhangi bir hack saldırısı kullanılabilir?)

Örneğin. , Işaretler, henüz bir ihtiyaç - Bu 've sağlar o SQL çalışması yapmak ve bu yaygın Kaçırdığım SQL saldırıları HTML enjeksiyon için kullanılan stopped.Any diğer karakterler olacak?

4 Cevap

Gerçekten söyleyebilirim: adlarını doğrulamak kalkmayın: bir gün veya başka, kod ... o "yanlış" olduğunu düşünüyor bir ad buluşacak Ve nasıl bir uygulama "{[söyler zaman bir tepki vereceğini düşünüyorsunuz (0)]} "?

Eğer gerçekten ulaşmak istediğinize bağlı olarak, "değil-adları" düşündünüz dışlamak için, kara / filtreleri çeşit kullanarak düşünebilirsiniz: en azından belki bazı "kötü-adları" geçmesine izin verecek, ancak, bu Başvurunuzu erişmesini varolan herhangi bir ad engel olmamalıdır.

Burada akla gelen kuralları birkaç örnek:

  • Hiçbir numara
  • "~{()}@^$%?;:/*§£ø gibi özel bir karakter, ve muhtemelen bazı diğerleri
  • artık 3 boşluk olduğunu?
  • none of "admin", "support", "moderator", "test", and a few other obvious non-names that people tend to use when they don't want to type in their real name...
    • (Onlar kendi adını vermek istemiyorum ama, onların hala, bazı rasgele harfler yazarak onları korusun bile, onlar sadece kendi ait değil ... Hangi gerçek bir isim kullanabilirsiniz olmaz)

Evet, bu mükemmel değil; ve evet, bazı olmayan isimler geçmesine izin verir ... Ama birisi "senin adın yanlış" (yes, I insist ^^ ) söyleyerek daha da uygulama için muhtemelen iyi bir yol var


And, to answer a comment you left under one other answer :

I could just forbid the most command characters for SQL injection and XSS attacks,

SQL Injection hakkında, veritabanına bu göndermeden önce verilerinizi kaçmak gerekir; her zaman bu verileri kaçış eğer, (! yapmanız gerekir), umurumda gerekmez kullanıcıların neleri olabilir girişi ya da değil: kaçtı gibi, her zaman, sizin için hiçbir riski yoktur.

XSS hakkında aynı: (! Gerekir) bunu ouputting zaman her zaman verilerinizi kaçış olarak, enjeksiyon riski yoktur ;-)


Eğer sadece böyle olduğunu regex kullanırsanız EDIT :, oldukça iyi çalışmaz:

Aşağıdaki kodu:

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

Size en az bir uyarı alırsınız:

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

Siz bu özel karakter, en azından bazı kaçmak gerekir; Sana PCRE Patterns daha fazla bilgi almak için (there is really a lot to know about PCRE / regex ; and I won't be able to explain it all) kazmak izin vereceğim

Aslında bu karakterlerin hiçbiri verilerinin verilen bir parça içeride olup olmadığını kontrol etmek istiyorsanız, böyle bir şey ile sonuna kadar olabilir:

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

(This is a quick and dirty proposition, which has to be refined!)

This one says "OK" (well, I definitly hope my own name is ok!)
And the same example with some specials chars, like this :

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

"Kötü bir isim" diyecek

Ama ben not tam bu test ettik not, ve muhtemelen daha fazla çalışma ihtiyacı lütfen! Eğer çok dikkatli test sürece sitenizde kullanmak etmeyin!


Also note that a single quote can be helpful when trying to do an SQL Injection... But it is probably a character that is legal in some names... So, just excluding some characters might no be enough ;-)

Bu hiç de kolay bir genel çözümü ile ilgili bir sorun var. Şey gerçekten bir isim muhtemelen içerebilir hangi karakterleri tahmin edemezler. Muhtemelen en iyi çözüm gerçekten bir isim sonuna kadar istemediğiniz bazı özel karakterleri çıkarmak için bir negatif karakter maske tanımlamaktır.

Bunu kullanarak bunu yapabilirsiniz:

$ Sıradanifade = "/ ^ [^ <put unwanted characters here>] + $ /

Karakter daha büyük bir dizi yayılan PHP’s PCRE implementation destekleri Unicode character properties. Yani \p{L} (harf karakterleri), \p{P} (noktalama işaretleri) ve \p{Zs} (boşluk ayırıcı karakterleri) bir arada kullanabilirsiniz:

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

Ancak bazı izin istemiyorum ki dahil olabilir iken bu karakter kategorilerde kapsamına girmeyen karakterler olabilir.

Yani bir gerçek kişinin adı gibi gibi değerler belirsiz bir dizi ile bir kıyas üzerinde düzenli ifadeler kullanarak karşı size tavsiye.


Edit sizin sorunuzu düzenlenmiş ve artık sadece belirli bir kod enjeksiyon saldırıları önlemek istediğinizi görmek gibi: Sen daha ziyade potansiyel bir saldırı girişimi olarak reddetmekten daha bu karakterleri kaçmak gerekir.

mysql_real_escape_string or prepared statements SQL sorguları için kullanın htmlspecialchars Diğer diller için HTML çıktısı ve diğer uygun işlevler için.

Eğer PHP ayrı bir insan ismi ayrıştırmak çalışıyorsanız, ben salık Keith Beckman's nameparse.php script.