Programowanie w języku PHP

Księga gości od A do Z

  • 2006-06-03 13:52
  • 4 komentarze
  • 11330 odsłon
  • Oceń ten tekst jako pierwszy

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);
  }
?>



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>




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

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

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

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!

4 komentarze

eSpEY 2008-10-06 20:08

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

:)

HeadShot 2007-07-15 03:31

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

Setesh 2006-09-02 17:50

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

Marooned 2006-06-03 14:31

Przydałyby się wcięcia...