[PHP] Kilka pytań o bezpieczeństwo skryptów


(Krzkaczor) #1

Hej!

Mam kilka pytań dotyczących bezpieczeństwa skryptów php i zagadnień z tym związanym.

  1. Czy ta funkcja wystarczy do filtrowania wszystkich danych pochodzących z tablic $_GET, $_POST i z formularzy?

    function prepareString($text) {

    $text = addslashes($text);
    
    $text = htmlspecialchars($text);
    
    return $text;

    }

Z tego co się orientuje jeszcze powinienem dopisać sprawdzanie czy magic_quotes jest włączone bo inaczej po " powstaną ukośniki...

  1. O co chodzi z identyfikatorami sesji np. podczas wysyłania postu? Jest identyfikator bodajże sid który jest przesyłany metodą $_GET po co to?

Proszę o odpowiedź i pozdrawiam


(flaszer) #2

1) Trochę bym to uzupełnił. Dla przykładu, jeżeli oczekujesz na zmienna _POST typu całkowitego, to sprawdzałbym, czy dane przychodzące to rzeczywiście liczba itd.


(Howks0) #3

Tak jak kolega flaszer napisał, rzutuj dane na typ numeryczny jeśli spodziewasz się liczby (np. dodaj dodatkowy parametr do funkcji, że jesli = True to rzutujesz)

Zmień również funkcje addslashes() na mysql_real_escape_string()

Magic quotes zawsze powinno być na Off a dane powinny być odpowiednio filtrowane przez programistę. Nie sprawdzaj czy jest włączone tylko jeśli masz możliwość to wyłącz.

SID w adresie oznacza to ze SID jest w adresie zamiast w cookie (zależy od danej konfiguracji sesji). Plus tego jest taki że nie jesteś zależny od cookie (bo niby użytkownik może mieć wyłączone cookie chociaż ja się jeszcze z taką osobą nie spotkałem) minus tego jest taki że - osoba X może za plecami osoby Y która jest np. zalogowana na forum przepisać SID danej sesji i przejąć konto. Osobiście = tylko cookie


(Airborn) #4

wychodzisz z błędnego założenia, że funkcja nazywająca się prepareString może zajmować się czymś co w domyśle ma być liczbą, a zasadniczo tak nazwana funkcja powinna była zajmować się tylko tekstem

tutaj kolejne CHYBA błędne założenie, że użytkownik zamierza wykorzystywać mysql, w zasadzie wszystko zależy od tego na ile podobnie działają funkcje takie jak mysql_real_escape_string(), mysqli_real_escape_string(), pg_escape() i co tam jest jeszcze...


(Krzkaczor) #5

Ok dzięki za info.

Podsumowując, jeżeli dane idą do bazy danych to lepiej stosować mysql_real_escape_string(), tak?


(Airborn) #6

lepiej korzystać z metod natywnych dla danego systemu zarządzania bazą, lepiej w ogóle nie korzystać z funkcji zaczynających się od mysql_


(Krzkaczor) #7

Dzięki za odpowiedzi. Czyli lepiej korzystać z addslashes(). A możesz mi wytłumaczyć (wiem że zapewne głupie pytanie) co to są metody natywne? :slight_smile: W googlach pisze tylko coś o javie...


(Airborn) #8

nie, lepiej nie korzystać z addslashes, lepiej korzystać z funkcji przygotowanej dla systemu bazodanowego którego używasz, jednak korzystanie z mysql poprzez funkcje przygotowane specjalnie pod ten system (mysql_real_escape_string(), mysqli_real_escape_string(), pg_escape() itd.). jednak obsługa mysql w php poprzez funkcje mysql_ jest mało wydajna dlatego lepszym rozwiązaniem, jeżeli korzystasz z mysql będzie zainteresowanie się mysqli albo PDO


(athei) #9

Zgadzam się z tym. Polecam http://www.phpro.org/tutorials/Introduction-to-PHP-and-MySQL.html, gdzie w przykładach zaprezentowane są te 3 sposoby (mysql, mysqli, pdo) operowania na bazie danych.