Księga gości od A do Z
Wstęp
W tym artykule stworzymy prostą księgę gości opartą o php i mysql. Skrypt będzie odporny na podstawowe próby zaśmiecenia i spamu. Jest to mój pierwszy artykuł, więc proszę o wyrozumiałość i poprawienie błędów ;)
Przede wszystkim potrzebne są nam trzy rzeczy:
1)Serwer php i mysql
2)Znajomość php na poziomie średnim
3)i jak zawsze cierpliwość ;)
Zaczynamy!
Nasza księga gości składać się będzie z trzech plików. Pierwszy wyświetli wszystkie dotychczasowe wpisy, drugi to formularz, a trzeci do wysyłania do bazy nowego wpisu.
Zaczniemy od skryptu wyświetlającego istniejące wpisy. Najprostsza wersja wygląda tak:
plik1.php
<?
//tutaj podaj haslo,login,nazwe bazy i hosta
$haslo='haslo';
$login='login';
$host='localhost';
$baza='baza';
//logowanie do serwera mysql
@ $bd = mysql_pconnect($host, $login, $haslo);
if (!$bd)
{
echo 'Połączenie z bazą danych jest teraz nie możliwe.';
exit;
}
mysql_select_db($baza);
//wysyłamy zapytanie
$zapytanie = 'SELECT * FROM `tablica` WHERE 1 LIMIT 0, 30';
$dd = mysql_query($zapytanie);
$bb = mysql_fetch_array($dd);
while($bb)
{
$wpis=stripslashes($bb['wpis']);
$imie=stripslashes($bb['imie']);
//wyswietlamy wpis
echo '<br>Napisał: '.$imie.'<br><br>'.$wpis;
$bb = mysql_fetch_array($dd);
}
?>
//tutaj podaj haslo,login,nazwe bazy i hosta
$haslo='haslo';
$login='login';
$host='localhost';
$baza='baza';
//logowanie do serwera mysql
@ $bd = mysql_pconnect($host, $login, $haslo);
if (!$bd)
{
echo 'Połączenie z bazą danych jest teraz nie możliwe.';
exit;
}
mysql_select_db($baza);
//wysyłamy zapytanie
$zapytanie = 'SELECT * FROM `tablica` WHERE 1 LIMIT 0, 30';
$dd = mysql_query($zapytanie);
$bb = mysql_fetch_array($dd);
while($bb)
{
$wpis=stripslashes($bb['wpis']);
$imie=stripslashes($bb['imie']);
//wyswietlamy wpis
echo '<br>Napisał: '.$imie.'<br><br>'.$wpis;
$bb = mysql_fetch_array($dd);
}
?>
Teraz wystarczy stworzyć odpowiednią tablice, podmienić haslo,login,nazwe bazy danych i tablicy w skrypcie i plik pierwszy gotowy!
Oczywiście możemy sobie teraz dodać do tego jakiś fajny wygląd, ale to już zostawiam wam ;)
Zajmijmy się teraz formularzem dodającym wpisy. Podstawowa wersja naszej księgi gości będzie pobierała od użytkownika jedynie podpis oraz
treść wpisu. Oto on:
formularz.html
<html>
<head><title>Księga gości - formularz</title></head>
<body>
<form enctype="multipart/form-data" action="dodaj.php" method="post">
<p>Podpis:</p><input name="imie" type="text" maxlength="26" SIZE="30"><br>
<br><p>Treść:</p><textarea name="wpis" cols="60" rows="7"></textarea>
<br><br><input type="submit" value="Dodaj">
<form>
</body>
</html>
<head><title>Księga gości - formularz</title></head>
<body>
<form enctype="multipart/form-data" action="dodaj.php" method="post">
<p>Podpis:</p><input name="imie" type="text" maxlength="26" SIZE="30"><br>
<br><p>Treść:</p><textarea name="wpis" cols="60" rows="7"></textarea>
<br><br><input type="submit" value="Dodaj">
<form>
</body>
</html>
Nasz formularz wysyła dane metodą post do pliku "dodaj.php". W takim razie musimy napisać plik "dodaj.php". Źródło:
dodaj.php
<?
//tutaj podaj haslo,login,nazwe bazy i hosta
$haslo='haslo';
$login='login';
$host='localhost';
$baza='baza';
//pobieramy dane
$imie=$_POST['imie'];
$wpis=$_POST['wpis'];
//znowu logujemy sie do bazy mysql
@ $bd = mysql_pconnect($host, $login, $haslo);
if (!$bd)
{
echo 'Połączenie z bazą danych jest teraz nie możliwe.';
exit;
}
mysql_select_db($baza);
//wysylamy zapytanie
$zapytanie = "insert into `tablica` values ('".$wpis."', '".$imie."')";
$dd = mysql_query($zapytanie);
if($dd)
{
echo 'Wpis został dodany pomyślnie';
}
else
{
echo 'Niestety dodanie wpisu nie jest teraz możliwe, prosze spróbować później.';
}
//wczytanie pliku pierwszego
echo '<script>';
echo 'var strona="plik1";';
echo 'self.location.href=strona+".php";';
echo '</script>';
?>
//tutaj podaj haslo,login,nazwe bazy i hosta
$haslo='haslo';
$login='login';
$host='localhost';
$baza='baza';
//pobieramy dane
$imie=$_POST['imie'];
$wpis=$_POST['wpis'];
//znowu logujemy sie do bazy mysql
@ $bd = mysql_pconnect($host, $login, $haslo);
if (!$bd)
{
echo 'Połączenie z bazą danych jest teraz nie możliwe.';
exit;
}
mysql_select_db($baza);
//wysylamy zapytanie
$zapytanie = "insert into `tablica` values ('".$wpis."', '".$imie."')";
$dd = mysql_query($zapytanie);
if($dd)
{
echo 'Wpis został dodany pomyślnie';
}
else
{
echo 'Niestety dodanie wpisu nie jest teraz możliwe, prosze spróbować później.';
}
//wczytanie pliku pierwszego
echo '<script>';
echo 'var strona="plik1";';
echo 'self.location.href=strona+".php";';
echo '</script>';
?>
Napisaliśmy własnie prostą księgę gości ;) Jeśli chcesz pobrać powyższy skrypt naciśnij tutaj.
Bezpieczeństwo
To była chyba najprostsza z możliwych wersji ksiąg. Nadszedł, więc czas na zabezpieczenie naszego skryptu.
Tagi html
Jest to bardzo poważny błąd jeśli nie usuniemy wszelkich tagów html. Dlaczego?
Spójrzmy co by się stało gdyby ktoś napisał w treści wiadomości takie coś:
<table border=1 width="9999px" height="9999 px"><td>X</td></table>
I już jest po naszej ślicznej księdze. Jak się przed tym uchronić? Proste! Stosujemy funkcje strip_tags(), która usuwa wszelkie tagi html. Zobaczcie sami:
dodaj.php
<?
//tutaj podaj haslo,login,nazwe bazy i hosta
$haslo='haslo';
$login='login';
$host='localhost';
$baza='baza';
//pobieramy dane
$imie=$_POST['imie'];
$wpis=$_POST['wpis'];
//usuwamy tagi html
$wpis=strip_tags($wpis);
$imie=strip_tags($imie);
//znowu logujemy sie do bazy mysql
@ $bd = mysql_pconnect($host, $login, $haslo);
if (!$bd)
{
echo 'Połączenie z bazą danych jest teraz nie możliwe.';
exit;
}
mysql_select_db($baza);
//wysylamy zapytanie
$zapytanie = "insert into `tablica` values ('".$wpis."', '".$imie."')";
$dd = mysql_query($zapytanie);
if($dd)
{
echo 'Wpis został dodany pomyślnie';
}
else
{
echo 'Niestety dodanie wpisu nie jest teraz możliwe, prosze spróbować później.';
}
//wczytanie pliku pierwszego
echo '<script>';
echo 'var strona="plik1";';
echo 'self.location.href=strona+".php";';
echo '</script>';
?>
//tutaj podaj haslo,login,nazwe bazy i hosta
$haslo='haslo';
$login='login';
$host='localhost';
$baza='baza';
//pobieramy dane
$imie=$_POST['imie'];
$wpis=$_POST['wpis'];
//usuwamy tagi html
$wpis=strip_tags($wpis);
$imie=strip_tags($imie);
//znowu logujemy sie do bazy mysql
@ $bd = mysql_pconnect($host, $login, $haslo);
if (!$bd)
{
echo 'Połączenie z bazą danych jest teraz nie możliwe.';
exit;
}
mysql_select_db($baza);
//wysylamy zapytanie
$zapytanie = "insert into `tablica` values ('".$wpis."', '".$imie."')";
$dd = mysql_query($zapytanie);
if($dd)
{
echo 'Wpis został dodany pomyślnie';
}
else
{
echo 'Niestety dodanie wpisu nie jest teraz możliwe, prosze spróbować później.';
}
//wczytanie pliku pierwszego
echo '<script>';
echo 'var strona="plik1";';
echo 'self.location.href=strona+".php";';
echo '</script>';
?>
Spam
No dobra, ale co wtedy, gdy komuś się będzie nudziło i wpisze ten sam wpis 100 razy ? Przed tym uchronić się możemy na kilka sposobów, ale według mnie najlepsze jest ograniczenie czasowe. Po każdym wysłanym wpisie na serwerze jest zapisywana data i godzina jego wysłania. Jakikolwiek następny wpis będzie mógł być wysłany dopiero na przykład za pięć minut. Aby to zrobić musimy dodać do plik dodaj.php takie coś:
<?
$date=date("j, n, Y");
if (file_exists("data.txt")) {
$data_c = fopen("data.txt","r");
$spr=fgets($data_c,20);
fclose($data_c);
}
if (file_exists("czas.txt")) {
$czas_c = fopen("czas.txt","r");
$spr_c=fgets($czas_c,20);
fclose($czas_c);
}
if($date!=$spr)
{
$ok=1;
}
else
{
if(date("i")>$spr_c)
{
$ok=1;
}
else
{
if($spr_c-date("i")>5)
{
$ok=1;
}
}
}
if($ok==1)
{
if (file_exists("data.txt")) {
$data = fopen("data.txt","w");
fwrite($data,$date);
fclose($data);
}
if (file_exists("czas.txt")) {
$czas = fopen("czas.txt","w");
fwrite($czas,date("i"));
fclose($czas);
}
}
else
{
echo'Dodawanie wpisu będzie możliwe z jakiś czas';
exit;
}
?>
$date=date("j, n, Y");
if (file_exists("data.txt")) {
$data_c = fopen("data.txt","r");
$spr=fgets($data_c,20);
fclose($data_c);
}
if (file_exists("czas.txt")) {
$czas_c = fopen("czas.txt","r");
$spr_c=fgets($czas_c,20);
fclose($czas_c);
}
if($date!=$spr)
{
$ok=1;
}
else
{
if(date("i")>$spr_c)
{
$ok=1;
}
else
{
if($spr_c-date("i")>5)
{
$ok=1;
}
}
}
if($ok==1)
{
if (file_exists("data.txt")) {
$data = fopen("data.txt","w");
fwrite($data,$date);
fclose($data);
}
if (file_exists("czas.txt")) {
$czas = fopen("czas.txt","w");
fwrite($czas,date("i"));
fclose($czas);
}
}
else
{
echo'Dodawanie wpisu będzie możliwe z jakiś czas';
exit;
}
?>
Dodajemy ten skrypt przed tym co do tej porty napisaliśmy w pliku dodaj.php. Aby Skrypt zadziałał w katalogu gdzie znajduje się księga tworzymy dwa pliki "czas.txt" i "data.txt" i dajemy im chmod 666.
Długość wpisu
Pozostało nam jeszcze zabezpieczyć naszą księgę przed zbyt długim wpisem. Jest to kolejna ważna rzecz. Wyobraź sobie co by się stało gdy by ktoś skopiował nam do formularza z 500kb text'u ;) Po powtórzeniu kilku razy tej czynności, dla modemowców połączenie z naszą stroną było by nie możliwe. Co gorsza, jeśli ktoś ma mało miejsca w bazie danych to można ją bez problemu zapchać. Do uniemożliwienia tego dodajemy coś takiego w pliku dodaj.php:
A oto cały kod dodaj.php z wszystkimi naszymi ulepszeniami:
<?
$date=date("j, n, Y");
if (file_exists("data.txt")) {
$data_c = fopen("data.txt","r");
$spr=fgets($data_c,20);
fclose($data_c);
}
if (file_exists("czas.txt")) {
$czas_c = fopen("czas.txt","r");
$spr_c=fgets($czas_c,20);
fclose($czas_c);
}
if($date!=$spr)
{
$ok=1;
}
else
{
if(date("i")>$spr_c)
{
$ok=1;
}
else
{
if($spr_c-date("i")>5)
{
$ok=1;
}
}
}
if($ok==1)
{
if (file_exists("data.txt")) {
$data = fopen("data.txt","w");
fwrite($data,$date);
fclose($data);
}
if (file_exists("czas.txt")) {
$czas = fopen("czas.txt","w");
fwrite($czas,date("i"));
fclose($czas);
}
}
else
{
echo'Dodawanie wpisu będzie możliwe z jakiś czas';
exit;
}
//tutaj podaj haslo,login,nazwe bazy i hosta
$haslo='haslo';
$login='login';
$host='localhost';
$baza='baza';
//pobieramy dane
$imie=$_POST['imie'];
$wpis=$_POST['wpis'];
if(strlen($wpis)>50000)
{
exit;
}
if(strlen($imie)>100)
{
exit;
}
//znowu logujemy sie do bazy mysql
@ $bd = mysql_pconnect($host, $login, $haslo);
if (!$bd)
{
echo 'Połączenie z bazą danych jest teraz nie możliwe.';
exit;
}
mysql_select_db($baza);
$tablica='tablica z wpisami';
//wysylamy zapytanie
$zapytanie = "insert into `$tablica` values ('".$wpis."', '".$imie."')";
$dd = mysql_query($zapytanie);
if($dd)
{
echo 'Wpis został dodany pomyślnie';
}
else
{
echo 'Niestety dodanie wpisu nie jest teraz możliwe, prosze spróbować później.';
}
//wczytanie pliku pierwszego
echo '<script>';
echo 'var strona="plik1";';
echo 'self.location.href=strona+".php";';
echo '</script>';
?>
$date=date("j, n, Y");
if (file_exists("data.txt")) {
$data_c = fopen("data.txt","r");
$spr=fgets($data_c,20);
fclose($data_c);
}
if (file_exists("czas.txt")) {
$czas_c = fopen("czas.txt","r");
$spr_c=fgets($czas_c,20);
fclose($czas_c);
}
if($date!=$spr)
{
$ok=1;
}
else
{
if(date("i")>$spr_c)
{
$ok=1;
}
else
{
if($spr_c-date("i")>5)
{
$ok=1;
}
}
}
if($ok==1)
{
if (file_exists("data.txt")) {
$data = fopen("data.txt","w");
fwrite($data,$date);
fclose($data);
}
if (file_exists("czas.txt")) {
$czas = fopen("czas.txt","w");
fwrite($czas,date("i"));
fclose($czas);
}
}
else
{
echo'Dodawanie wpisu będzie możliwe z jakiś czas';
exit;
}
//tutaj podaj haslo,login,nazwe bazy i hosta
$haslo='haslo';
$login='login';
$host='localhost';
$baza='baza';
//pobieramy dane
$imie=$_POST['imie'];
$wpis=$_POST['wpis'];
if(strlen($wpis)>50000)
{
exit;
}
if(strlen($imie)>100)
{
exit;
}
//znowu logujemy sie do bazy mysql
@ $bd = mysql_pconnect($host, $login, $haslo);
if (!$bd)
{
echo 'Połączenie z bazą danych jest teraz nie możliwe.';
exit;
}
mysql_select_db($baza);
$tablica='tablica z wpisami';
//wysylamy zapytanie
$zapytanie = "insert into `$tablica` values ('".$wpis."', '".$imie."')";
$dd = mysql_query($zapytanie);
if($dd)
{
echo 'Wpis został dodany pomyślnie';
}
else
{
echo 'Niestety dodanie wpisu nie jest teraz możliwe, prosze spróbować później.';
}
//wczytanie pliku pierwszego
echo '<script>';
echo 'var strona="plik1";';
echo 'self.location.href=strona+".php";';
echo '</script>';
?>
Zakończenie
To już wszystko. Mam nadzieję, że spodobał wam się ten artykuł ;)
Wszelkie pytania i propozycje prosze kierować na mojego maila.
konrad(dot)g(at)poczta(dot)neostrada(dot)pl
Tutaj możesz ściągnąć cały skrypt.
Miłego pisania!



Zmieńcie to:
//pobieramy dane
$imie=$_POST['imie'];
$wpis=$_POST['wpis'];
na
//pobieramy BEZPIECZNE dane
$imie=addslashes(htmlspecialchars($_POST['imie']));
$wpis=addslashes(htmlspecialchars($_POST['wpis']));