Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Bezpieczeństwo strony
Forum PHP.pl > Forum > Przedszkole
adrianozo
Witam wszystkich.
Mam pytanie. Napisałem sobie funkcję, która ma zabezpieczać mi zmienne. Teraz pytanie brzmi czy ta funkcja jest wystarczająca, co do niej ewentualnie dodać, usunąć lub zmienić i czy mogę filtrować nią każdą zmienną?

Funkcja:

  1. <?php
  2. function filtr($val)
  3. {
  4. $val = trim($val);
  5. $val = addslashes($val);
  6. $val = htmlspecialchars($val);
  7. return $val;
  8. }
  9. ?>
foxbond
zamiast
mysql_real_escape_string($val);
napisz
mysql_escape_string($val);

Ten pierwszy pobiera identyfikator połączenia (Tak w ogóle addslashes + htmlspecialchars starczy)
pyro
@foxbond, niestety rada jest wątła i niestety dosyć bezużyteczna.

@adrianozo, stosowanie takich funkcji jest bardzo problematyczne i generalnie nie powinno się tego stosować, na pewno nie jest to w żaden sposób uniwersalne zabezpieczenie. Warto też zauważyć, że chociażby funkcja addslashes(); stosowana po mysql_real_escape_string(); nie jest potrzebna, zwłaszcza, że nie służy ona do zabezpieczania.
adrianozo
Czyli podsumowując co do zmiany, usunięcia, dodania.

Mogę filtrować wszystkie zmienne?

Cała funkcja po przeróbkach wygląda tak:

  1. <?php
  2. function filtr($val)
  3. {
  4. $val = trim($val);
  5. $val = strip_tags($val);
  6. {
  7. $val = addslashes($val);
  8. }
  9. $val = htmlspecialchars($val, ENT_QUOTES);
  10. return $val;
  11. }
  12. ?>
Wicepsik
Moim zdaniem takie coś jest bezsensu. Wszystko zależy od tego co filtrujesz..
bełdzio
a jak będziesz chciał przefiltrować txt, który ma zawierać znaczniki HTML i trafić do bazy?
marcio
Cytat
zamiast
mysql_real_escape_string($val);
napisz
mysql_escape_string($val);

Ten pierwszy pobiera identyfikator połączenia (Tak w ogóle addslashes + htmlspecialchars starczy)

http://php.net/manual/pl/function.mysql-re...cape-string.php
Tak jak napisal @pyro rada nie zbyt trafiona :]

Ja mam tak ze mam klase ktora globalnie filtruje get,post,cookie,session a w sterowniku baz danych automatycznie rzutuje mi na int jesli zmienna ktora przesylam jest liczba lub dodaje mysql_real_escape_string gdy argument jest string'iem.

Dlatego uniwersalne metody sa do bani.
adrianozo
Wiesz... do klas to mi daleko biggrin.gif

To chyba pozabezpieczałem:

przy tej funkcji:

  1. <?php
  2. function filtr($val, $htmlspecialchars=false)
  3. {
  4. $val = trim($val);
  5. $val = strip_tags($val);
  6. {
  7. $val = addslashes($val);
  8. }
  9. if($htmlspecialchars)$val = htmlspecialchars($val);
  10. return $val;
  11. }
  12. ?>


Wyrzuca błąd i nie wiem co on oznacza i w czym jest błąd:

Kod
Fatal error: Cannot redeclare filtr() (previously declared in functions/filtr.php:2) in functions/filtr.php  on line 2
Zyx
Dane powinieneś filtrować w momencie, gdy zaczynasz z nimi coś konkretnego robić, a nie gdy przychodzą one do skryptu. Ponadto stosowanie "uniwersalnej" funkcji jest zupełnie pozbawione sensu, gdyż:

1. Dane nie muszą trafić do bazy.
2. Po co poprawiać apostrofy, ciachy itd. kiedy później przyjmujemy, że dana zmienna może zawierać tylko liczby?
3. Twórcy PHP już próbowali takie coś wbudować w język. Efektem jest magic_quotes, czyli najbardziej upierdliwa rzecz w całym parserze. Dobrze, że w PHP 6 w końcu ona wylatuje na amen.

Zamiast tego powinieneś użyć:

1. Biblioteki PDO - korzystając z podpinania nie musisz w ogóle dodawać żadnych ciachów, przepuszczać danych przez addslashes() lub mysql_real_escape_string() itd.
2. Porządnych sprawdzarek, do których wprowadzisz reguły w stylu: zmienna A ma być liczbą z zakresu od 0 do 20, zmienna B ma być tekstem zawierającym same litery itd.

Jeśli sprawdzarki znajdą błąd, przerywasz wykonanie i rzucasz komunikat o błędzie użytkownikowi. Jeśli dane muszą trafić do bazy, wtedy ewentualnie filtrujesz apostrofy. Jeśli do pliku, nie filtrujesz, jeśli do PDF, filtrujesz specjalne komendy PDF-a. Tak to powinno działać.
adrianozo
To co mam zrobić?
Pawel_W
najprościej filtrować dane bezpośrednio przed zapisem, wtedy wiesz do czego która zmienna służy i możesz ją przepuścić przez odpowiednie funkcje, jednak jest to czasem kłopotliwe przy większej ilości kodu, gdyż można o czymś zapomnieć smile.gif
adrianozo
Ok błąd rozwiązany smile.gif
Pytanie jak wy sobie z tym radzicie?
Pawel_W
używam zend framework i nie martwię się o filtrowanie danych smile.gif
pyro
Cytat(adrianozo @ 19.04.2010, 17:51:54 ) *
Czyli podsumowując co do zmiany, usunięcia, dodania.

Mogę filtrować wszystkie zmienne?

Cała funkcja po przeróbkach wygląda tak:

  1. <?php
  2. function filtr($val)
  3. {
  4. $val = trim($val);
  5. $val = strip_tags($val);
  6. {
  7. $val = addslashes($val);
  8. }
  9. $val = htmlspecialchars($val, ENT_QUOTES);
  10. return $val;
  11. }
  12. ?>



@adrianozo, widać, że w ciemno napisałeś tę funkcję, nie wiedząc nawet, co robią funkcje zawarte wewnątrz niej. Wypada najpierw dowiedzieć się, co one robią.
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.