adrianozo
19.04.2010, 14:55:16
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:
<?php
function filtr($val)
{
return $val;
}
?>
foxbond
19.04.2010, 14:57:19
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
19.04.2010, 15:28:38
@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
19.04.2010, 16:51:54
Czyli podsumowując co do zmiany, usunięcia, dodania.
Mogę filtrować wszystkie zmienne?
Cała funkcja po przeróbkach wygląda tak:
<?php
function filtr($val)
{
{
}
return $val;
}
?>
Wicepsik
19.04.2010, 16:54:06
Moim zdaniem takie coś jest bezsensu. Wszystko zależy od tego co filtrujesz..
bełdzio
19.04.2010, 18:04:40
a jak będziesz chciał przefiltrować txt, który ma zawierać znaczniki HTML i trafić do bazy?
marcio
19.04.2010, 18:06:31
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.phpTak 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
19.04.2010, 18:08:07
Wiesz... do klas to mi daleko

To chyba pozabezpieczałem:
przy tej funkcji:
<?php
function filtr($val, $htmlspecialchars=false)
{
{
}
return $val;
}
?>
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
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ć.
Pawel_W
19.04.2010, 18:32:05
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ć
adrianozo
19.04.2010, 18:41:33
Ok błąd rozwiązany

Pytanie jak wy sobie z tym radzicie?
Pawel_W
19.04.2010, 18:42:10
używam zend framework i nie martwię się o filtrowanie danych
pyro
19.04.2010, 21:07:48
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:
<?php
function filtr($val)
{
{
}
return $val;
}
?>
@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ą.