Księga gości od A do Z

konrad.g

Wstęp

W tym artykule stworzymy prostą księgę gości opartą o PH i MySql. Skrypt będzie odporny na podstawowe próby zaśmiecenia i spamu.
Przede wszystkim potrzebne są nam trzy rzeczy:

  1. Serwer PHP i MySQL
  2. Znajomość PHP na poziomie średnim

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:

<?
//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:

<code class="html4strict">
<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>';
?>




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ś: ``
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 ```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>'; ?> ```

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ś:
```php <? $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.
<h1>Długość wpisu</h1>
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:
```php
<?
if(strlen($wpis)>50000)
{
exit;
}
if(strlen($imie)>100)
{
exit;
}
?>





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>';
?>

4 komentarzy

Nie jest odporna na SQL Injection :(

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']));

:)

Wszystko ładnie i przejrzyscie napisane, tak powinno byc wszedzie ;) Dzieki :)

a jak zrobic ksiege gosci na plikach txt ? Skoro od A do Z to na plikach też powinna być opisana możliwość ;-)

Przydałyby się wcięcia...