konto usunięte

Temat: Regex

Używam annotations z regex w Symfony2 do walidacji w klasach. Zapis typu:
@Assert\Regex( "/(?=.*[0-9])/" )

Nakłada mi wymóg podania przynajmniej jednej cyfry. Ale nie potrafię zrozumieć dlaczego taka regułka z Java, daje wynik pozytywny dla cyfr?
@Assert\Regex( "/(?=.*[@#$%^&+=!'?()*:;,-_])/" )


Ktoś mi może podpowiedzieć jak w PHP należy określić prawidłowo ciąg znaków specjalnych? Wiem że błąd powoduje podkreślnik na końcu. Ale dlaczego tak się dzieje i jak się przed tym zabezpieczyć?Ten post został edytowany przez Autora dnia 01.09.16 o godzinie 21:34
Marcin S.

Marcin S. Software
craftsmanship

Temat: Regex

Odnośnie pierwszego regexpa: powinno wystarczyć samo:

@Assert\Regex( "/\d/" )


Użycie tam asercji (czyli "(?=...)" ) jest mocno nadmiarowe... Trochę więcej o asercjach masz tutaj: http://php.net/manual/en/regexp.reference.assertions.php.

Co do drugiej części: błędu nie powoduje dodanie podkreślnika, tylko użycie myślnika w miejscu innym niż początek/koniec klasy. Gdy myślnik jest wewnątrz nawiasów kwadratowych, to ma wtedy specjalne znaczenie: zakres. Czyli prawidłowym stają się znaki których kody są równe lub większe od kodu sprzed myślnika (w tym wypadku przecinek) aż do znaków którego kod jest mniejszy lub równy znakowi za myślnikiem (czyli w tym wypadku podkreślnik).

konto usunięte

Temat: Regex

Dzięki!

To jeszcze może pytanie z nieco innej beczki. Jaki jest zestaw dozwolonych znaków specjalnych, odpornych na wszystkie ataki.
Chodzi mi XSS, SQL injection, XML injection, XPath injection itp.
Szukałem dziś tego ze 2 godziny ale nie znalazłem konkretów.
Robert P.

Robert P. Senior PHP Developer

Temat: Regex

Dawid Z.:
Dzięki!

To jeszcze może pytanie z nieco innej beczki. Jaki jest zestaw dozwolonych znaków specjalnych, odpornych na wszystkie ataki.
Chodzi mi XSS, SQL injection, XML injection, XPath injection itp.
Szukałem dziś tego ze 2 godziny ale nie znalazłem konkretów.

Cieżko o taki "uniwersalny" zestaw. Dlatego stosuje się funkcje typu "escape". Dla XSS możesz albo usunać wszystkie znaki html (strip_tags()) albo użyć htmlentities() dla SQL INjection musisz użyć w zależności od rodzaju bazy danych i rodzaju biblioteki do połączenia np mysqli_real_escape_string() itp.

jedyny rozsądny i bezpieczny regex to po prostu `\w`. Ogólnie, żebyś był w 100% bezpieczny musisz zastosować:

- Santanizacja
- Walidacja
- Escapowanie
- Filtrowanie

Nie możesz użyć tylko 1. I tutaj w PHP przychodzi z pomocą funkcja filter_var () z zestawem gotowych filtrów:

http://www.php.net/manual/en/filter.filters.sanitize.php
http://www.php.net/manual/en/filter.filters.validate.php
Marcin S.

Marcin S. Software
craftsmanship

Temat: Regex

Nie zgodzę się tylko że "Ogólnie, żebyś był w 100% bezpieczny" to mit, nigdy nie jesteś 100% bezpieczny - zazwyczaj tylko jeszcze o tym nie wiesz ;) Z resztą wypowiedzi Roberta się zgadzam ;)
Robert P.

Robert P. Senior PHP Developer

Temat: Regex

No tak masz rację nie ma 100% bezpieczeństwa, ale przy zastosowaniu tego co napisałem masz 99, 9%, że to czego oczekujesz jest tym co dostajesz.

konto usunięte

Temat: Regex

Mam tylko taki problem że Regex mogę używać w adnotacjach walidacyjnych dla klas Symfony2. Natomiast wszelkie funkcje typu strip_tags() to już raczej w dodatkowych funkcjach walidujących. A trochę mam tych klas i atrybutów.
Stwierdziłem że najprościej będzie wyciąć wszelkie niebezpieczne znaki typu <'> itp. Jednak nie znalazłem żadnej zbiorczej rozpiski. A szkoda bo wygodnie byłoby wiedzieć które znaki specjalne są w pełni bezpieczne.

@Marcin Sztolcman
Tak średnio się zgodzę, można zrobić w 100% skuteczną walidację. Trzeba tylko wyciąć wszelkie znaki o znaczeniu specjalnym.
Co do reszty to jednak wielka niewiadoma ;)

Następna dyskusja:

Regex w RewriteRule




Wyślij zaproszenie do