Jeżeli chcemy dodać post, wpis lub cokolwiek innego to tworzymy formularz HTML <form>, a następnie odbieramy za pomocą PHP.
Teraz, jeżeli chcemy ograniczyć liczbę wpisów z danego formularza do wyłącznie jednego, to złym sposobem jest robienie tego za pomocą samego ukrycia/zlikwidowania/zablokowania formularza w HTML, bo daną treść można wstrzyknąć zdalnie... Wiem, że to pewnie dla większości z Was oczywistość, ale może ktoś nowy to przeczyta i będzie bardziej świadomy problemu, a ja chce tym wątkiem poruszyć temat możliwej obrony przed zdalnym wstrzykiwaniem danych do tego typu formularzy.
Jak się bronić przed kolejnym wstrzyknięciem treści?
Najprostszy i najskuteczniejszy sposób jaki przychodzi mi do głowy, to po walidacji danych, tuż przed wykonaniem INSERT'u do SQL należy zapytać baze czy nie ma wcześniejszego wpisu od danego ID, który chce dokonać kolejnego (zakazanego) wpisu.
Przykładowy kod poglądowy wygląda tak:
$id = (int)$_POST['id']; $tresc = walidacja($_POST['tresc']); $tresc = mysqli_real_escape_string($con,$tresc); $INSERT = "INSERT INTO `przyklad` (`prosty`,`id`) VALUES ('$tresc','$id');"; $WymaganeSprawdzeniePrzedInsert = 'SELECT id FROM `przyklad` WHERE `id`='$id';'; if ($result = mysqli_query($con, $WymaganeSprawdzeniePrzedInsert)){ if(!mysqli_num_rows($result)){ mysqli_query($con, $INSERT); } } }
Teraz mam dwa pytania:
1. Czy mogę skutecznie określić lokalizację w PHP przy odbiorze danych, skąd dokładnie dane zostały wysłane (w sensie z jakiego pliku)? oraz czy będzie to wystarczające żeby ograniczyć wstrzykiwanie z zewnątrz? Jeżeli można to zapoda ktoś przykład?
2. Czy istnieje jeszcze jakiś dodatkowy sposób na pomocną walidację danych?