[php][html]formularz wysyłania +autoryzacja


(Marwan89) #1

Utworzyłem formularz do wysyłania wiadomości. Chciałem wprowadzić małe zabezpieczenie związane z autoryzacją, wszystko fajnie śmiga tylko że gdy dam wyślij to wyskakuje mi że hasło jest nie poprawne choć tak naprawdę kod przepisany jest prawidłowo. Wydaje mi się że trochę namieszałem w tym kodzie i teraz nie mogę dojść gdzie są te błędy. Jeśli ktoś miałby chwilkę i naprawił moje błędy. Do tego kodu są jeszcze dwa inne skrypty, ale one są w stu procentach sprawne.

<?php


if (count($_POST)) 

{ 


 if ($_POST[mail] == "" || $_POST[tresc]=="") 

 { 


?>
 

e-mail:



Treść:






Wyślij 
Wyczyść 
 


<?php 


 session_start(); 

 $kod = md5(md5($ID)); //generujemy 32-bitowy token zawartości zmiennej ID przesłanej z formularza autoryzacja.php i przypisujemy do zmiennej kod

 if ($kod==$sprawdz) //sprawdzamy czy kod się zgadza

 {


 } else{ 

////////// USTAWIENIA ////////// 

$email = 'bukrudy8@gmail.com'; // Adres e-mail adresata 

$subject = 'Reklama na kort'; // Temat listu 

$message = 'Dziękujemy za wysłanie formularza'; // Komunikat 

$error = 'Wystšpił błšd podczas wysyłania formularza'; // Komunikat błędu 

$charset = 'iso-8859-2'; // Strona kodowa 

////////////////////////////// 


$head = 

"MIME-Version: 1.0\r\n" . 

"Content-Type: text/plain; charset=$charset\r\n" . 

"Content-Transfer-Encoding: 8bit"; 

$body = ''; 

foreach ($_POST as $name => $value) 

{ 

if (is_array($value)) 

{ 

for ($i = 0; $i < count($value); $i++) 

{ 

$body .= "$name=" . (get_magic_quotes_gpc() ? stripslashes($value[$i]) : $value[$i]) . "\r\n"; 

} 

} 

else $body .= "$name=" . (get_magic_quotes_gpc() ? stripslashes($value) : $value) . "\r\n"; 

} 

echo mail($email, "=?$charset?B?" . base64_encode($subject) . "?=", $body, $head) ? $message : $error; 

} }

else 

{ 


 echo "haslo niepoprawne"; //wyświetlamy stosowną informację

 }

 session_unregister('sprawdz'); //usuwamy z sesji wartość sprawdz

	}

?>
 
e-mail:



Tre¶ć:




<?

include ("autoryzacja.php");

?>
 [/code]

Mam też prośbę jakby ktoś mógłby mi wskazać gdzie mogę wrzucić kod podany tutaj


(Zbyszekborkowski) #2

Sporo tam namieszałeś.

Źle posłużyłeś się tablicą $_POST. Zmienne, do których się odwołujesz powinieneś umieścić w apostrofach. Warunek sprawdzający również niepoprawny.

W Twojej wersji skrypt zostawał uruchamiany, gdy przynajmniej jedno pole formularza było puste. Powinien wyglądać tak:

if ($_POST['mail'] != "" && $_POST['tresc'] != "") {...}

Poza tym, algorytm do wysyłania maila wrzuciłeś w złym miejscu - else{...}. W obecnym stanie mail zostanie wysłany, gdy hasło będzie inne niż kod autoryzacyjny. Algorytm powinieneś był wrzucić do if-a wyżej.

Nigdzie nie widać przypisania wartości do zmiennej $sprawdz, ale zakładam, że masz to gdzieś wcześniej.

Wrzuciłem też kod sprawdzający poprawność maila. Całość powinna wyglądać mniej więcej tak (rób wcięcia - kod będzie czytelniejszy :wink: ):

<?php


if (count($_POST)) {


    if ($_POST['mail'] != "" && $_POST['tresc'] != "") {

        if (preg_match("/^([a-z0-9_-])+([\.][a-z0-9_-]+)*[a-z0-9]@([a-z0-9-])+(\.[a-z0-9-]+)*\.([a-z]{2,6})$/", $_POST['mail'])) {


        ?>

e-mail:



Treść:



Wyślij
Wyczyść



            <?php


            session_start();

            $kod = md5(md5($ID)); //generujemy 32-bitowy token zawartości zmiennej ID przesłanej z formularza autoryzacja.php i przypisujemy do zmiennej kod

            if ($kod==$sprawdz) { //sprawdzamy czy kod się zgadza


                ////////// USTAWIENIA //////////

                $email = 'bukrudy8@gmail.com'; // Adres e-mail adresata

                $subject = 'Reklama na kort'; // Temat listu

                $message = 'Dziękujemy za wysłanie formularza'; // Komunikat

                $error = 'Wystąpił błąd podczas wysyłania formularza'; // Komunikat błędu

                $charset = 'iso-8859-2'; // Strona kodowa

                //////////////////////////////


                $head =

                "MIME-Version: 1.0\r\n" .

                "Content-Type: text/plain; charset=$charset\r\n" .

                "Content-Transfer-Encoding: 8bit";

                $body = '';


                foreach ($_POST as $name => $value) {

                    if (is_array($value)) {

                        for ($i = 0; $i < count($value); $i++) {

                            $body .= "$name=" . (get_magic_quotes_gpc() ? stripslashes($value[$i]) : $value[$i]) . "\r\n";

                        }

                    }

                    else $body .= "$name=" . (get_magic_quotes_gpc() ? stripslashes($value) : $value) . "\r\n";

                }

                echo mail($email, "=?$charset?B?" . base64_encode($subject) . "?=", $body, $head) ? $message : $error;

            }

            else {

                echo "haslo niepoprawne"; //wyświetlamy stosowną informację

            }

        }

        else echo 'Niepoprawny adres email.'; //komunikat, jeśli adres email nie jest prawidłowy

    }

    session_unregister('sprawdz'); //usuwamy z sesji wartość sprawdz

}

?>

e-mail:



Treść:




    <?

    include ("autoryzacja.php");

    ?>
  [/code]

(Marwan89) #3

Wielkie dzięki za poprawienie. Nie jestem dobry w programowaniu. Jednak nadal nie wszystko działa. Po kliknięciu w wyślij pojawiał się drugi formularz jednak już bez autoryzacji. Usunąłem tą część kodu:

e-mail:



Treść:



Wyślij
Wyczyść
[/code]

I już drugie okienko się nie pojawiało, nadal cały czas wyskakuje że podane hasło jest nie poprawne.


(Zbyszekborkowski) #4

Pokaż część kodu, w której dodajesz zmienną $sprawdz. Tajemne hasło możesz oczywiście zmienić na jakieś tymczasowe :wink: .


(Marwan89) #5

http://compzone.org/art-Autoryzacja+kodem+z+obrazka+w+PHP-30.html

korzystałem z tego przy autoryzacji.


(Zbyszekborkowski) #6

Tak sobie patrzę i nigdzie nie widzę deklaracji zmiennych $ID i $sprawdz po odebraniu formularza.

Przed warunkiem porównującym hasło z tokenem dopisz:

$ID = $_POST['ID'];

$sprawdz = $_POST['sprawdz'];

Myślę, że to powinno pomóc.


(Marwan89) #7

Działa! Wielkie dzięki.

Wszystko fajnie tylko wiadomości przesłane są bardzo mało czytelne.

PHPSESSID=551b9c57f203ec6358ef8dcbe884d54f


mail=xxxxx@gmail.com


tresc=proba generalna

ID=70


sprawdz=4d1738f9a2556f73c292420a4f094168

(Zbyszekborkowski) #8

To:

foreach ($_POST as $name => $value) {

     if (is_array($value)) {

          for ($i = 0; $i < count($value); $i++) {

                $body .= "$name=" . (get_magic_quotes_gpc() ? stripslashes($value[$i]) : $value[$i]) . "\r\n";

           }

      }

      else $body .= "$name=" . (get_magic_quotes_gpc() ? stripslashes($value) : $value) . "\r\n";

}

Zamień na to:

$dane = array('mail', 'tresc');


for ($k = 0; $k < count($dane); $k++) {

     $value = $_POST[$dane[$k]];

     $name = $dane[$k];


     if (is_array($_POST[$name])) {

          for ($i = 0; $i < count($_POST[$name]); $i++) {

                $body .= "$name=" . (get_magic_quotes_gpc() ? stripslashes($value[$i]) : $value[$i]) . "\r\n";

          }

     }

     else $body .= "$name=" . (get_magic_quotes_gpc() ? stripslashes($value) : $value) . "\r\n";

 }

Jeśli chcesz dodać jeszcze jakieś informacje do przesyłanego maila, to dodaj odpowiednie nazwy z formularza do tablicy $dane.