Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zabezpieczenie formularzy
Forum PHP.pl > Forum > Przedszkole
Jarod
Czy znacie jakieś inne dobre sposoby zabezpieczania formularzy przed załamaniem skryptu php oprócz stosowania funkcji strip_tags i HTMLSpecialChars()?

Pozdrawiam
nospor
1)escape'owanie
2)rzutowanie na konkretny typ, czyli jak masz mieć w inputa wpisaną liczbę, to rzutujesz ją na int, żeby napewno otrzymać int, anie jakiś napis, który może zaszkodzić ($zm=(int)$zm)
Jarod
Cytat
1)escape'owanie

Możesz napisać co dokładnie miałeś na myśli?

Cytat
2)rzutowanie na konkretny typ, czyli jak masz mieć w inputa wpisaną liczbę, to rzutujesz ją na int, żeby napewno otrzymać int, anie jakiś napis, który może zaszkodzić ($zm=(int)$zm)


No też dobre ale jak zamieci stringa na liczbe? Może też wyjść coś głupiego. A nie liepij sprawdzać czy użytkownik podał liczbe zamiast łańcucha?

I jeszcze jedna sprawa. Chcę wykorzystać strip_tags i dodaję tą funkcje w skrypcie zapisującym do bazy.
  1. <?php
  2.  
  3. $query = &#092;"INSERT INTO tabela (tabela_id, imie, nazwisko) \".
  4. &#092;"VALUES ($ID, strip_tags('$_POST[imie]'), strip_tags('$_POST[nazwisko]') );\";
  5.  
  6.  
  7. ?>


I wywala mi błą przy zapisie. Gdzie popełniam błąd?
nospor
escape'owanie funkcja mysql_escape_string()


Cytat
No też dobre ale jak zamieci stringa na liczbe? Może też wyjść coś głupiego

Konkretnie wyjdzie 0. Ale skoro tam miała być liczba, to string jest już sam w sobie błędny, więc wszystko ok.

Cytat
A nie liepij sprawdzać czy użytkownik podał liczbe zamiast łańcucha?

Też można

Błąd ci wywala, bo dajesz funkcje php w zapytaniu. tak nie można

  1. <?php
  2.  
  3. $query = &#092;"INSERT INTO tabela (tabela_id, imie, nazwisko) \".
  4. &#092;"VALUES ($ID, '\".strip_tags('$_POST[imie]').\"','\". strip_tags('$_POST[nazwisko]').\"' )\";
  5.  
  6. ?>
Jarod
Cytat
Błąd ci wywala, bo dajesz funkcje php w zapytaniu. tak nie można

  1. <?php
  2.  
  3. $query = &#092;"INSERT INTO tabela (tabela_id, imie, nazwisko) \".
  4. &#092;"VALUES ($ID, '\".strip_tags('$_POST[imie]').\"','\". strip_tags('$_POST[nazwisko]').\"' )\";
  5.  
  6. ?>


thx tongue.gif

I już ostatnie pytanie. Zanim zapisze do bazy sprawdzam, czy każde pole zostało wypełnione (później to zmienie na dokładniejsze sprawdzanie i nie wszystkie pola - dla kilku zostawię możliwość pozostawienia pustego). Mniej więcej to wygląda tak:
  1. <?php
  2.  
  3. if ($_POST[login] == '') $CzyWypelnione = 0;
  4. if ($_POST[haslo] == '') $CzyWypelnione = 0;
  5. if ($_POST[imie] == '') $CzyWypelnione = 0;
  6. if ($_POST[nazwisko] == '') $CzyWypelnione = 0;
  7. if ($_POST[pesel] == '') $CzyWypelnione = 0;
  8. if ($_POST[email] == '') $CzyWypelnione = 0;
  9. if ($_POST[ulica] == '') $CzyWypelnione = 0;
  10. if ($_POST[kod] == '') $CzyWypelnione = 0;
  11. if ($_POST[miejscowosc] == '') $CzyWypelnione = 0;
  12. if ($_POST[telefon] == '') $CzyWypelnione = 0;
  13.  
  14. ?>


Jeżeli zmienna CzyWypelnione będzie miałą wartość 1 to zostanie wyświetlony odpowiedni komunikat i powrót do formularza.
Moje pytanie czy nie lepiej będzie jak w tym momencie (sprawdzenie wypełnienia formualarza) zastosować funkcję strip_tags zamiast w zapytaniu?
Które jest efektywniejsze/ może lepsze ?

Pozdrawiam
nospor
Cytat
Jeżeli zmienna CzyWypelnione będzie miałą wartość 1
Chyba chciales napisac: Jeżeli zmienna CzyWypelnione będzie miałą wartość 0

Swoją drogą trochę dziwnie to sprawdzasz, aco jesli kilka nie bedzie wypelnionych. Jak poinformujesz gościa, o które ci chodzi. Bedzie musial się domyslać.

strip_tags nie robisz w zapytaniu, tylko wstawiasz text do zapytania po wczesniejszym przepuszczeniu go przez strip_tags. Tak tylko pisze aby wszystko bylo jasne. To może być robione tak jak jest
Jarod
Cytat
Chyba chciales napisac: Jeżeli zmienna CzyWypelnione będzie miałą wartość 0
Tak. Moja pomyłka

Cytat
Swoją drogą trochę dziwnie to sprawdzasz, aco jesli kilka nie bedzie wypelnionych. Jak poinformujesz gościa, o które ci chodzi. Bedzie musial się domyslać.

To jest tylko tymczasowe rozwiązanie. Zostaje wyświetlony komunikat "Wypełnij wszystkie pola formularza" Więc przy drugim wypełnianiu będzie pilnował aby wszystko wypełnić

Cytat
strip_tags nie robisz w zapytaniu, tylko wstawiasz text do zapytania po wczesniejszym przepuszczeniu go przez strip_tags. Tak tylko pisze aby wszystko bylo jasne. To może być robione tak jak jest

Źle się zrozumieliśmy. ALe myślimy o tym samym tongue.gif

A jaki doradzasz sposób na sprawdzanie wypełnienia formualrza?

Pozdrawiam
nospor
No sprawdzasz, czy każde pole odpowiada założeniom.
jak ma być to liczba, to czy jest liczbą, jak email to czy jest emailem (jest wiele metod sprawdzania maila. bylo na forum, jest na necie), jak ma byc pesel to sprawdzasz czy to pesel itd.

  1. <?php
  2.  
  3. if (jest zly $email) $bademail=true
  4. else $bademail=false;
  5. //.....i tak dalej
  6.  
  7. echo '<input type=\"text\" name=\"email\" >'.($bademail?'[POPRAW]':'');
  8. //... itak dalej
  9.  
  10. ?>


MOżna inaczej, lepiej, gorzej. TO jest takie podstawowe sprawdzanie.
Możesz też dodatkowo sprawdzać w js przed wyslaniem formularza.
Jarod
js odpada. Jeśli użytkownik wyłączy obsługę w przeglądarce to na nic takie sprawdzanie.
Chodzi mi po głowie stworzenie tablicy do której będe zapisywał nazwy pól źle wypełnionych i później je wyświetlał. To chyba dobry sposób.

Dziękuje za odpowieź i pozdrawiam
nospor
Cytat
js odpada. Jeśli użytkownik wyłączy obsługę w przeglądarce to na nic takie sprawdzanie.
Dlatego użyłem słowa "dodatkowo"
Sprawdzanie w js ma umilić pracę klientowi. Na serwerze mimo wszystko sprawdzanie ma być. Jak klient nie chce js, to mu się zawsze będzie stronka przelaodywywac, nawet jak ma źle. A tak by se czasu zaoszczędził. Ja zawsze mam wbudowaną walidacje i na serwerze i u klienta.

Radziłbym bym Ci też, jeśli to będą skompliowane formularze, używać klas do formularzy. UŁatwiają one życie. NIektóre też zawierają wbudowaną podwójną walidację.
Jarod
Wracając do funkcji strip popełniłeś błąd..

Zamiast
  1. <?php
  2. $query = &#092;"INSERT INTO tabela (tabela_id, imie, nazwisko) \".
  3. &#092;"VALUES ($ID, '\".strip_tags('$_POST[imie]').\"','\". strip_tags('$_POST[nazwisko]').\"' )\";
  4. ?>


powinno być
  1. <?php
  2. $query = &#092;"INSERT INTO tabela (tabela_id, imie, nazwisko) \".
  3. &#092;"VALUES ($ID, '\".strip_tags($_POST[imie]).\"','\". strip_tags($_POST[nazwisko]).\"' )\";
  4. ?>

bo inaczej do bazy zapisze nie wartość tylko "$_POST[imie]"..


Druga sprawa, która zresztą mnie nie pokoi to wynik testu, który przeprowadziłem. Wszyscy dobrze wiem, że gdy nie zastosujemy funkcji strip_tags, ktoś wpisując w formularzu "Imię" ciąg "[b ]Jakiesimie[/b ]" otrzyma Jakiesimie.
Więc przeprowadziłem test. Dodałem funkcje strip_tags do zmiennej imie a do zmiennej nazwisko nie.
Wyglądało to tak
  1. <?php
  2. $query = &#092;"INSERT INTO tabela (tabela_id, imie, nazwisko) \".
  3. &#092;"VALUES ($ID, '\".strip_tags($_POST[imie]).\"','$_POST[nazwisko])' )\";
  4. ?>

okazało się ohmy.gif , że stripuje wszystkie zmienne, chociaż chciałem tylko jedną.. A wypisuje jako ciąg znaków "[b ]Jakiesimie[/b ]". Wydawało mi się, że znaczniki html są usuwane...
nospor
Cytat
Wracając do funkcji strip popełniłeś błąd..

Sorki, ciapki mialy być w $_POST czyli $_POST['imie']. Dobrym (bardzo dobrym) zwyczajem jest uzywanie ciapków do oznaczenia literlanych indexów tablicy.
Cytat
okazało się  , że stripuje wszystkie zmienne, chociaż chciałem tylko jedną
hihi, tym razem ty poplelniles blad. powinno byc:
  1. <?php
  2.  
  3. $query = &#092;"INSERT INTO tabela (tabela_id, imie, nazwisko) \".
  4. &#092;"VALUES ($ID, '\".strip_tags($_POST['imie']).\"','\".$_POST['nazwisko'].\"' )\";
  5.  
  6. ?>
Jarod
Cytat
Sorki, ciapki mialy być w $_POST czyli $_POST['imie'].

No niezupełnie bo jak zrobie tak jak piszesz to skrypt nie wykonuje się. Biała strona

Do tej pory używałem sposobu np:
  1. <?php
  2.  
  3.  $query = &#092;"INSERT INTO klient (konto_id, imie, nazwisko)\".
  4.  &#092;" VALUES ($ID,'$_POST[imie]','$_POST[nazwisko]');\";
  5.  
  6. ?>

I działało poprawnie. Jak dodam ciapki np $_POST['imie'] to już nie działa.

Cytat
hihi, tym razem ty poplelniles blad.  powinno byc:

  1. <?php
  2.  
  3. $query = &#092;"INSERT INTO tabela (tabela_id, imie, nazwisko) \".
  4. &#092;"VALUES ($ID, '\".strip_tags($_POST['imie']).\"','\".$_POST['nazwisko'].\"' )\";
  5.  
  6. ?>


Ale ja nie chciałem, żeby usuwało tagi z tych dwóch zmiennych, tylko z pierwszej (imie).
Robie tak jak podałeś tylko bez tych ciapek i usuwa z obydwóch zmiennych sadsmiley02.gif
nospor
Cytat
Do tej pory używałem sposobu np:
      $query = "INSERT INTO klient (konto_id, imie, nazwisko)".
                " VALUES ($ID,'$_POST[imie]','$_POST[nazwisko]');";

bo ci sie ciapki wtedy mieszaly. trzeba wiedziec jak używać. Zauważ ze ze strip_tags są ciapki (w mojej metodzie i dziala).

Cytat
Ale ja nie chciałem, żeby usuwało tagi z tych dwóch zmiennych, tylko z pierwszej (imie).
No i moja metoda to robi. NIe ma prawa ci usuwać z nazwiska, gdy nazwisko nie jest objęteę tą funkcją. Moze ty poprostu do nazwiska nie dopisujesz tagów html, więc ich nie zapisuje do bazy. W tym zapytaniu ucinam tylko w imie.
Jarod
Jeszcze raz bo się chyba nie rozumiemy.

I. Zacznę od tego, że Ty każesz zapisaywać w ten sposób (narazie prześledźmy bez strip_tags):
  1. <?php
  2.  
  3. $query = &#092;"INSERT INTO tabela (tabela_id, imie, nazwisko) \".
  4. &#092;"VALUES ($ID, '\".$_POST['imie'].\"','\".$_POST['nazwisko'].\"' )\";
  5.  
  6. ?>

A ja do tej pory zapisywałem też tak:
  1. <?php
  2.  
  3.  $query = &#092;"INSERT INTO tabela (tabela_id, imie, nazwisko)\".
  4.  &#092;" VALUES ($ID, '$_POST[imie]' , '$_POST[nazwisko]' );\";
  5.  
  6. ?>

i działało. Poprawnie dodawało do bazy. Więc nie wiem dlaczego uparłeś się żeby stosować to kropke i odzielać, skoro obydwa zapisy są poprawne?

II.
Byłem przekonany, że funkcja strip_tags usuwa znacznik i zapisuje do bazy bez znaczników. Ale jak ją zastosuje i podam w formularzu znaczniki pogrubuające, a potem chcę odczytać dane i wyświetlić w przeglądarce, to nie pogrubia tekstu ale wypisuje znaczniki i dziwnie to wygląda.

Przecież do wypisywania znaczników a nie ich obcinania służy funkcja HTMLSpecialChars()... Więc co jest nie tak? Może przy odczycie danych też powiniem stosować funkcję strip_tags??

III. Skoro mój sposób zapisu (bez kropki patrz punkt I) działa to dlaczego ten zapis nie działa
  1. <?php
  2.  
  3. $query = &#092;"INSERT INTO tabela (tabela_id, imie, nazwisko) \".
  4. &#092;"VALUES ($ID, '\".strip_tags($_POST[imie]).\"', '$_POST[nazwisko]' )\";
  5.  
  6.  
  7. ?>

tylko stripuje obie zmienne?


EDIT:
-------
Problem rozwiązany. Zamiast <b></b> podawałem [b ][/b ]. Czasami warto odejść od komputera na 5 minut winksmiley.jpg

Pozdrawiam
nospor
Cytat
Więc nie wiem dlaczego uparłeś się żeby stosować to kropke i odzielać, skoro obydwa zapisy są poprawne
Bo jest dobrym zwyczajem pisać indexy tekstowego dla tablic w ciapkach
Cytat
Problem rozwiązany. Zamiast <b></b> podawałem [b ][/b ].
Też już chcialem Ci na to zwrócić uwagę winksmiley.jpg
Ilmenauer
Generalnie, jeśli chodzi o kontrolę pól formularza to polecam PEAR i QuickForm. W sposób niemalże trywialny definiujesz formularz, filtry (czyli np. wytnij spacje) i wzorce do sprawdzania wartości(po stronie serwera jak i klienta) i nie trzeba znać JS... i php właściwie też nie, he, he, he... winksmiley.jpg Wogóle grucha jest piękna. Tylko trzeba czasu i cierpliwości na zapoznanie.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.