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:
- Serwer PHP i MySQL
- 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>';
?>
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...