Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zmiana automatycznych danych
Forum PHP.pl > Forum > PHP
benzulli
Witam.

Przeglądając sobie bazę własnoręcznie zbudowanego modułu zadziwiła mnie jedna rzecz. Do bazy danych pobieram od każdego użytkownika IP i datę, kiedy wysłał formularz. Wszystkie rekordy są poprawne, po za jednym, gdzie ktoś sobie ustawił IP na własne oraz datę ustawił jako napis tekstowy. Jak to można zrobić? Jak to jest w ogóle możliwe? Czy to zmiana ustawienia komputera czy coś wspólnego z SQL injection? A jeżeli SQL injection to potrzebna jest nazwa zmiennej bądź nazwa tabeli w bazie?
Turson
Jaki typ kolumny daty? Gdybyś miał typ związany z datą np. date/datetime/timestamp to nie wstawi się zwykłego tekstu tam.

Pokaż linijkę kodu PHP gdzie wstawiasz dane do bazy
benzulli
  1. $ajpi = addslashes($_POST['ajpi']);
  2. $data = addslashes($_POST['data']);
  3.  
  4. $ins = @mysql_query("INSERT INTO slowo SET cytat='$cytat', autor='$autor', ip='$ajpi', data='$data'");


  1. <input type="hidden" name="ajpi" value="<?php echo $_SERVER['REMOTE_ADDR']; ?>">
  2. <input type="hidden" name="data" value="<?php echo date("Y-m-d H:i:s"); ?>">


Typy kolumn to tekst, ciekawi mnie przede wszystkim to jak ktoś to mógł to zmienić.
Turson
Co do daty - kolumna typu tekst więc się nie dziw, że można wrzucić tam co się chce.
Możliwości poprawienia:
- zmiana na np. datetime i narzucenie użytkownikowi, że może wrzucić datę tylko w tym formacie (walidacja)
- jeżeli dopuszczasz różne typy daty, to wybierz kilka możliwych i filtruj

Zmień mysql_ na PDO, bo używasz już dinozaura, który oficjalnie został uznany za przestarzały i zostanie wycofany z użytku.
benzulli
Użytkownik nie może nic wrzucać bo to pole jest hidden i automatycznie się wpisuje.

Jeżeli chodzi o weryfikację, to mógłbym użyć preg_match, ale najbardziej interesuje mnie jak ktoś mógł sobie to zmienić

Co do pdo to dzięki, sam dopiero zaczynam i widzę, że jednak będę musiał się z tym zapoznać.
Turson
Cytat
Użytkownik nie może nic wrzucać bo to pole jest hidden i automatycznie się wpisuje.

To można zmienić np. w firebugu. Datę generuj w zapytaniu
Prezi2907
Cytat(Turson @ 13.04.2014, 23:37:11 ) *
Co do daty - kolumna typu tekst więc się nie dziw, że można wrzucić tam co się chce.
Możliwości poprawienia:
- zmiana na np. datetime i narzucenie użytkownikowi, że może wrzucić datę tylko w tym formacie (walidacja)
- jeżeli dopuszczasz różne typy daty, to wybierz kilka możliwych i filtruj

Zmień mysql_ na PDO, bo używasz już dinozaura, który oficjalnie został uznany za przestarzały i zostanie wycofany z użytku.


PDO to przerost formy nad treścią, używaj mysqli, prostsza składnia (niemal to samo co mysql) i wygodniejsza w używaniu.

Co do problemu to pole data zmień na tym datetime to pierwsza rzecz.
Druga jeżeli pole ma zawsze dzisiejszą datę to po czorta ładujesz ją tutaj a nie w samym zapytaniu bezpośrednio?
To samo z adresem API. Przecież to adres serwera to po czorta przekazywać to z formularza smile.gif Poniżej gotowiec.
Przykład:
  1. $m = new mysqli("localhost" , "root" , "pass", "dbName");
  2.  
  3. $m->query("INSERT INTO slowo SET cytat='".$m->real_escape_string($cytat)."', autor='".$m->real_escape_string($autor)."', ip='".$_SERVER['REMOTE_ADDR']."', data='".date("Y-m-d H:i:s")."'");


Sam sobie tym przekazywaniem robisz krzywdę. Dziwie się że jeszcze portal stoi bo zrobić na tym SQL INJECTION to dziecinada smile.gif
Staraj się dane parsować zawsze przez funkcję real_escape_string o której poczytasz sobie w manualach i która jest podstawą zabezpieczenia przed SQL INJECTION. smile.gif

Ps. Jeżeli ten formularz leci spoza Twojego serwera to zamiast IP wysyłaj link wysyłającego czyli Refere $_SERVER['HTTP_REFERER']; Ta zmienna zwraca Ci skąd ktoś przyszedł do Ciebie smile.gif Zasada jak wyżej z adresem IP smile.gif
nospor
Cytat
PDO to przerost formy nad treścią, używaj mysqli, prostsza składnia (niemal to samo co mysql) i wygodniejsza w używaniu.

To ze nie umiesz uzywac i nie rozumiesz o co biega, nie znaczy ze to przerost formy nad trescia wink.gif

Cytat
Druga jeżeli pole ma zawsze dzisiejszą datę to po czorta ładujesz ją tutaj a nie w samym zapytaniu bezpośrednio?

A po czorta w ogole ją generowac w php?
zamiast twojego data='".date("Y-m-d H:i:s")."'"
mozna zrobic tak: data=now()

Cytat
Sam sobie tym przekazywaniem robisz krzywdę. Dziwie się że jeszcze portal stoi bo zrobić na tym SQL INJECTION to dziecinada
Staraj się dane parsować zawsze przez funkcję real_escape_string o której poczytasz sobie w manualach i która jest podstawą zabezpieczenia przed SQL INJECTION.
No niestety twoj kod tez jest podatny na sqlinjection... o prosze, tutaj:
ip='".$_SERVER['REMOTE_ADDR']."'
albo tutaj: $_SERVER['HTTP_REFERER']; , wg. Twojego pozniejszego pomyslu
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.