W jaki sposób stworzyć uniwersalny skrypt do wysyłania zawartości formularzy internetowych na stronie WWW. Formularze są podstawą działania wielu aplikacji internetowych. Pozwalają na łatwą komunikację pomiędzy użytkownikiem a skryptem działającym po stronie serwera.
Formularze są podstawą działania wielu
aplikacji internetowych. Pozwalają na łatwą
komunikację pomiędzy użytkownikiem
a skryptem działającym po stronie serwera.
Dzięki zastosowaniu języka HTML możliwe jest
stworzenie prostych pól umożliwiających pobranie
danych od użytkownika.
Problemy pojawiają się
jednak wtedy, gdy należy wysłać lub sprawdzić
dane zawarte w formularzu. W tym zakresie język
HTML nie oferuje zbyt dużej funkcjonalności i zmuszeni
jesteśmy użyć innej technologii (np. PHP)
działającej po stronie serwera.
Wyrażenia regularne
Wyrażenia regularne (ang. regular expressions) to
wzorce, które opisują łańcuchy symboli i znaków.
Wyrażenia regularne mogą określać zbiór pasujących
łańcuchów, mogą również wyszczególniać
istotne części łańcucha.
Celem tego artykułu jest zaprezentowanie
szybkiej i prostej metody automatyzacji obsługi
formularzy internetowych. Artykuł przedstawi krok
po kroku proces tworzenia skryptu umożliwiającego
wysłanie oraz weryfikację danych pochodzących
z dowolnego formularza internetowego.
Dzięki
zastosowaniu wyrażeń regularnych oraz ukrytych
pól konfiguracyjnych stworzymy uniwersalne rozwiązanie
pozwalające na łatwą i szybką implementację
na dowolnej stronie internetowej.
Projekt skryptu
Całość projektu została podzielona na trzy pliki.
Pierwszy to zwykły dokument HTML zawierający
formularz internetowy wraz z ukrytymi polami
umożliwiającymi ustawienie podstawowej konfiguracji skryptu. Drugi plik odpowiedzialny jest
za wygenerowanie i przesłanie zawartości pól do
użytkownika oraz administratora ankiety. Ostatni
moduł przeznaczony jest do sprawdzania poprawności
pól oraz wyświetlenia komunikatu błędu.
Podczas tworzenia skryptu szczególną uwagę
zwrócimy przede wszystkim na dwa ostatnie
moduły. Zostaną one zaprojektowane w ten sposób,
aby możliwe było podpięcie pod nie formularza bez
jakiejkolwiek zmiany kodu. W tym celu w formularzu
umieścimy pola typu \”hidden\”, aby przekazywać
przez nie dane dotyczące adresu e-mail odbiorcy
oraz tematu wiadomości. Dodatkowo zdefiniowane
zostanie także ukryte pole zawierające token
wymagany podczas procesu wysyłania formularza.
Dzięki takiemu rozwiązaniu unikniemy problemów
związanych ze spamowaniem skrzynki e-mail przez
roboty wykorzystujące niezabezpieczone formularze.
Walidacja pól formularza
Sprawdzanie poprawności tekstu wpisywanego
przez użytkowników jest jedną z istotnych czynności
powtarzanych podczas przetwarzania danych
z formularza. Istnieją dwie główny metody
walidacji pól formularzy. Jedna działa po stronie
serwera i wykorzystuje technologie typu PHP,
druga wykorzystuje przeglądarkę internetową oraz
język JavaScript.
Jak łatwo się domyślić każda z nich ma wady
i zalety. W tym artykule zastosujemy metodę
walidacji pól za pomocą języka PHP, wykorzystującą
wyrażenia regularne. W ten sposób kontrola
poprawności danych wejściowych przekazana
zostanie skryptom działającym po stronie serwera
WWW. Zaletą tego rozwiązania jest przede wszystkim
uniezależnienie skryptu od ustawień indywidualnych
użytkownika oraz sposobów implementacji
języka JavaScript w przeglądarkach internetowych.
Oprócz znajomości podstaw wyrażeń regularnych potrzebna jest również wiedza na temat ich
zastosowania w języku PHP. W naszym wypadku
wykorzystamy funkcję ereg dopasowującą dany
wzorzec do tekstu źródłowego. Składnia funkcji
jest następująca:
int ereg ( string $pattern, string
$string [, array &$regs] )
gdzie:
- {stala}$pattern{/stala} – łańcuch znaków reprezentujący wzorzec
wykorzystany podczas dopasowania tekstu, - {stala}$string{/stala} – tekst wejściowy zawierający wyszukiwane
frazy, - {stala}$regs{/stala} – opcjonalne parametry – nie wykorzystywane
w tym artykule.
W przypadku odnalezienia wzorca w tekście
źródłowym, funkcja zwróci wartość liczbową
równą liczbie znaków dopasowania. W przeciwnym
wypadku rezultatem wykonania funkcji będzie
FALSE.
Po poznaniu kilku podstawowych zagadnień
teoretycznych warto przejść do zastosowania tej
wiedzy w praktyce. Moduł walidacji, jaki stworzymy,
jest prostą funkcją przyjmującą za argument
nazwę pola, które zostanie poddane weryfikacji,
oraz wartość wpisaną przez użytkownika.
Pierwszym zadaniem funkcji jest rozpoznanie
typu pola na podstawie jego nazwy,
a następnie dopasowanie przypisanego mu
wzorca. W przypadku błędnej weryfikacji do
zmiennej $error dopisany zostaje łańcuch znaków
zawierający opis błędu.
Automatyczne przetwarzanie pól
Drugim etapem tworzenia skryptu automatyzującego
obsługę formularzy jest napisanie modułu
odpowiedzialnego za odebranie zawartości pól
oraz ich odpowiednie przetworzenie.
Cykl działania tej części skryptu jest następujący:
- odebranie zawartości pól konfiguracyjnych
przesłanych jako ukryte elementy formularza, - wykonanie pętli foreach dla wszystkich elementów
wchodzących w skład formularza
(na tym etapie następuje walidacja pól), - wyświetlenie błędów lub wysłanie zawartości
formularza na adres e-mail podany w polach
konfiguracyjnych.
Przed rozpoczęciem poznawania kodu tej części
skryptu, warto jest zapoznać się z kilkoma użytecznymi funkcjami. Pierwszą z nich jest {stala}ereg_replace{/stala},
służąca do podmiany wzorca na inny
zdefiniowany przez nas tekst. Wykorzystamy ją
do usunięcia znaków podkreślenia występujących
w nazwach pól.
Kolejną funkcją jest array_key_exists,
której użyjemy do sprawdzenia, czy w danej tablicy
asocjacyjnej znajdują się interesujące nas wpisy.
Ma to na celu zabezpieczenie skryptu przed próbami
dostępu bez użycia formularza.
Ostatnią i najważniejszą funkcją jest mail(),
której głównym zadaniem jest wysłanie wiadomości
e-mail pod wskazany adres. Warto zapoznać się
ze składnią funkcji, gdyż jest ona często stosowana
we wszelakich aplikacjach PHP.
Składnia:
mail($to, $subject, $msg, $ $mailheaders);
gdzie:
- {stala}$to{/stala} – adres e-mail odbiorcy,
- {stala}$subject{/stala} – temat e-maila,
- {stala}$msg{/stala}- właściwa wiadomość,
- {stala}$mailheaders{/stala} – nagłówki przesłane wraz
z e-mailem.
Oto lista przykładowych nagłówków, jakie
można wykorzystać, przesyłając e-maila:
- \”{stala}Reply-To: adres_email@serwer.pl{/stala}\” – adres
e-mail nadawcy lub osoby do której zostanie
wysłana odpowiedź, - \”{stala}From: Jakiś tekst lub e-mail{/stala}\” – pole wyświetlane
jako \”Od\”, czyli tekst lub e-mail pojawiający
się w nagłówku e-maila.
Posiadając już pewne podłoże teoretyczne,
warto przystąpić do tworzenia części kodu
PHP odpowiedzialnej za przetwarzanie pól
formularza.
Przykładowy formularz internetowy
W poprzednich dwóch sekcjach udało nam się
stworzyć najważniejszą część naszego skryptu.
Przyszedł jednak czas na przetestowanie jego funkcjonalności.
W tym celu stworzymy prostą ankietę
internetową umożliwiającą zademonstrowanie
procesu \”podpinania\” dowolnego formularza pod
skrypt.
Zakończenie
Na koniec pozostało już tylko przetestowanie
działania formularza oraz stworzenie własnej
ankiety wykorzystującej zaprezentowane rozwiązanie.
Jeżeli formularz zostanie zbudowany według
zaprezentowanych w tym artykule wytycznych,
wówczas nie będzie potrzeby modyfikowania
plików skryptu.
Jest to wygodne rozwiązanie dla
osób nielubiących przepisywania kodu za każdym
razem, gdy należy stworzyć nową ankietę.
Zaprezentowany w artykule zestaw reguł to
oczywiście tylko przykład. Zaawansowane ankiety
mogą wymagać bardziej skomplikowanej walidacji.
Po starannym przeanalizowaniu kodu, dodanie
nowych reguł nie powinno stanowić większego
problemu.
Przykład 1. form_func.php – krok po kroku
Krok 1. Deklaracja funkcji checkField.
Pierwszy argument funkcji checkField zawiera
wartość wpisaną do pola tekstowego,
natomiast drugi jest nazwą tego pola. Nazwa
pola używana jest do wyboru odpowiedniego
wzorca.
function checkFields( $string,
$fieldName )
{
Krok 2. Rozpoznanie adresu e-mail
Rozpoznanie nazwy pola jako pola
zawierającego adres e-mail oraz próba
dopasowania wzorca odpowiedzialnego za jego
walidację. W przypadku błędu dopisywany jest
komunikat zawierający opis błędu.
if ( ereg(\'^[Ee][-]*mail$\', $field-Name ) ) {
if ( !ereg(\'^.+[@].+\.pl$\',
$string ) )
$error .= \"Adres e-mail niepoprawny:
$string \n\";
Krok 3. Rozpoznanie adresu URL
Próba rozpoznania nazwy pola jako adres
URL oraz walidacja jego zawartości. W tym
miejscu użyliśmy funkcji {stala}eregi{/stala}, która niczym nie
różni się od {stala}ereg{/stala} poza faktem, że jednakowo
traktuje wyrazy napisane różną wielkością liter.
} elseif ( eregi(\'^.*URL.*$\',
$fieldName ) ) {
if ( !ereg(\'^http://[A-Za-z]*\
..+$\', $string ) )
$error .= \"Podany adres nie jest poprawny: $string \n\";
Krok 4. Walidacja kodu pocztowego
Na tym etapie ma miejsce weryfikacja
kodu pocztowego (określonego wzorcem
XX-XXX, gdzie X jest cyfrą)
} elseif ( ereg(\'^[Kk]od [Pp]ocztowy$\',
$fieldName ) ) {
if ( !ereg(\'^[0-9][0-9]-[0-9][0-9][0-9]$\', $string ) )
$error .= \"Kod pocztowy nie jest poprawny: $string \n\";
Krok 5. Zignorowanie pół nieobowiązkowych
Pominięcie walidacji pól zawierających
w nazwie słowo \"opcjonalne\". W ten
sposób istnieje możliwość określenia pól, których
wypełnienie nie jest obowiązkowe.
} elseif ( ereg(\'^.*opcjonalne$\', $fieldName ) ) {$error .= \"\";
Krok 6. Zablokowanie wysyłki pustych pól
W przypadku braku możliwości rozpoznania
nazwy pola, użyj domyślnej reguły
która uniemożliwia przesłanie pustego pola.
} else {
if ( ereg(\'^[ ]*$\', $string ) )
$error .= \"Pole: $fieldName nie moze byc puste \n\";
}
Krok 7. Zwrócenie zawartości zmiennej $error.
W sytuacji, gdy walidacja została zakończona
sukcesem zmienna nie zawiera żadnego
ciągu znaków. W przeciwnym wypadku znaleźć
w niej można listę napotkanych błędów.
return $error;
}
?>
Przykład 2. mail_processing.php - krok po kroku
Krok 1. Sprawdzenie, czy skrypt został uruchomiony za pośrednictwem formularza
Próba odczytu wartości konfiguracyjnych (adres e-mail odbiorcy oraz
temat wiadomości) przesłanych z ukrytych pól formularza. Wyświetlenie
strony z błędem w przypadku nieodpowiedniego uruchomienia skryptu.
include \"form_func.php\";
if ( array_key_exists( \"mailto\", $_POST ) )
$mailto = $_POST[\"mailto\"];
else
header(\"Location: localhost/error.html\");
if ( array_key_exists( \"subject\", $_POST ) )
$subject = $_POST[\"subject\"];
else
header(\"Location: localhost/error.html\");
Krok 2. Implementacja zabezpieczenia antyspamowego
Walidacja poprawności tokena przesłanego razem z formularzem oraz
wyświetlenie komunikatu w przypadku błędu.
if ( array_key_exists( \"kod\", $_POST ) ) {
$kod = $_POST[\"kod\"];
if ( ! ( trim($kod) == $_POST[\"kod_odp\"] ) ) {
$errors .= \"Wpisano błędny token.\n\";
}
} else {
$errors .= \"Błędny token.\n\";
}
Krok 3. Przetworzenie formularza przy użyciu tablicy asocjacyjnej
Użyjemy tablicy ($_REQUEST) zawierającej zawartość przesłanych
pól. Pominięcie ukrytych pól konfiguracyjnych oraz walidacja
poprawności pozostałych pól. Na tym etapie następuje wygenerowanie treści
wiadomości e-mail oraz komunikatów wyświetlanych po stronie przeglądarki
internetowej.
foreach ( $_REQUEST as $field => $value )
{
if ( $field != \"subject\" && $field !=\"mailto\" &&
$field !=\"kod\" && $field != \"kod_odp\" )
{
$field = ereg_replace(\"_\", \" \", $field );
// replace _ with spaces
$errors .= checkFields( $value, $field
);
$mail_msg .= \"$field : $value \n\";
$textHTML .= \" $field :
$value
\";
}
}
Krok 4. Wyświetlenie potwierdzenia oraz wysłanie wiadomości e-mail
Stanie się tak w przypadku braku stwierdzenia błędów. Na tym etapie
usuwamy również znacznik \"{stala}_usunto_{/stala}\" z adresu e-mail przekazanego
w ukrytym polu formularza. Jest to zabezpieczenie uniemożliwiające przechwycenie
naszego adresu e-mail przez boty skanujące sieć.
if ( strlen( trim($errors) ) == 0 )
{
// HTML
$title = \"Formularz został wysłany\";
$opis = \"Dane zostały przesłane do redakcji
Dziękujemy!
\";
$textHTML .= \"
strona glówna \";
// Usun \"_usunto_\" z adresu e-mail
$mailto = ereg_replace(\"_usunto_\", \"\", $mailto );
// MAIL
$mail_msg .= \"\n\n\";
$mailheaders = \"From: $mailto \n\";
@mail( $mailto , $subject, $mail_msg, $mailheaders);
} else {
//HTML
$title = \"Formularz nie został wysłany!\";
$opis = \"Niestety formularz został blednie wypełniony.
Wróć i popraw poniższe błędy:\";
$textHTML = \"\" .nl2br($errors) . \"\" . \"
wróc i popraw\";
}
Krok 5. Wygenerowanie kodu HTML wyświetlającego stronę
Strona będzie zawierać podsumowanie lub ewentualnie opisy błędów.
echo \"
Przykładowa Ankieta - $title
$title
$opis
$textHTML
\";
?>
Przyklad 3. form.html - krok po kroku
Krok 1. Deklaracja nagłówka oraz struktury dokumentu HTML
Na początku strony należy zamieścić nagłówek zawierający niezbędne
deklaracje.
Przykładowa Ankieta
Krok 2. Utworzenie formularza wysyłającego zawartość pól
Użyjemy do tego metody POST. Warto zwrócić uwagę, że formularz
musi zostać przetworzony przez skrypt znajdujący się w pliku {stala}mail_processing.php{/stala}.