Zabezpieczenie PHP sendmail?

Mam mały problem potrzebowałbym zabezieczyć skrypt dotyczący wysyłki email, ale nie wiem jak to zrobić ktoś może pomóc? ??

 

Skrypt poniżej:

<?PHP

if(isset($_POST['submit'])) {

$mailnadawcy = $_POST['mailnadawcy'];
$mail = "treash@op.pl";
$temat = "Treash - Pytanie?";
$body = $_POST['body'];

$imie_nazwisko = $_POST['imie_nazwisko'];
$gmail = $_POST['gmail'];
$telefon = $_POST['telefon'];
$wiadomosc = $_POST['wiadomosc'];

$header = "Od: ". $mailnadawcy . "";

if ($_SERVER['REQUEST_METHOD'] == 'POST') {


$body = "From: $mailnadawcy\n
                 Imie, Nazwisko: $imie_nazwisko\n
                 Adres e-mail: $gmail\n
                 Telefon: $telefon\n
                 Tresc Wiadomosci: $wiadomosc\n
                 ";

mail($mail, $temat, $body, $header);

    $header = 'MIME-Version: 1.0' . "\r\n";
    $header .= 'Content-type: text/html; charset=utf-8' . "\r\n";
    $header .= 'From: '.$mailnadawcy.''."\r\n";
 
    $tmp = mail($mailnadawcy,$temat,$wiadomosc,$header);
    if($tmp) echo 'Wysłano!';
    else echo 'Wystąpił błąd';  
    
echo "<script language=\"javascript\" type=\"text/javascript\">
alert('Dziekuję za wysłanie maila, skontaktuję się z Państwem wkrótce...');
window.location = \"http://www.treash.pl/#contact\";
</script>";

exit();

}}
?>

Zabezpieczyć przed?

Zacznijmy od początku, sprawdzasz czy w tabeli post jest klucz submit aka

isset($_POST['submit'])

potem dopiero sprawdzasz czy jest to zapytanie typu POST

$_SERVER['REQUEST_METHOD'] == 'POST'

Struktura powinna przykładowo wyglądać tak:

<?php
require_once 'recaptchalib.php';
define('CAPTCHA_KEY', 'KLUCZ reCaptcha');
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
  try {
    // weryfikacja
    if (!isset($_POST['submit'])) {
      throw new Exception('Brak klucza submit', 0x1);
    }
    if (...reguła (np. filter)...) {
      throw new Exception('Opis błędu', 0x2);
    }
    if (!recaptcha_check_answer(CAPTCHA_KEY, $_SERVER['REMOTE_ADDR'], $_POST['recaptcha_challenge_field'], $_POST['recaptcha_response_field'])->is_valid) {
      throw new Exception('Błędny kod reCaptcha', 0x3);
    }
    //etc, etc, ...
    if (mail(...)) {
      echo 'Wiadomość została wysłana';
    } else {
      throw new Exception('Wystąpił problem z wysyłką wiadomości', 0x10);
    }
  } catch(Exception $e) {
    printf('%d: %s', $e->getCode(), $e->getMessage());
  }
}

Po stronie formularza (zakładam, że jest w tym samym pliku)

<form action method="post"><?= recaptcha_get_html(CAPTCHA_KEY) ?></form>

Potrzebuje zabezpieczyć/przerobić ten skrypt tak aby nie był publicznie dostępny i nie można było w nim grzebać osobom nieupoważnionym…w tej chwili mam problem bo webmaster z mojego hostingu powiedział że każdy może uzyć tego skryptu np. do rozsyłania spamu.

 

Nie jestem na tyle dobry w PHP aby sobie z tym w pełni poradzić, więc każda pomoć będzie mile widziana.

 

Czy ta częć kodu jest kompletna czy muszę jeszcze coś dodać?

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
  try {
    // weryfikacja
    if (!isset($_POST['submit'])) {
      throw new Exception('Brak klucza submit');
    }
    //etc, etc, ...
  } catch(Exception $e) {
    printf('%d: %s', $e->getCode(), $e->getMessage());
  }
}

Zobacz teraz, masz dorzuconą obsługę recaptcha - musisz tylko jeden plik wgrać na serwer.

jeszcze jak byś mógł mi to wszystko do kupy złożyć z moim skryptem tak żeby było kompletnym działającym skryptem to będę BARDZO wdzięczny…

 

To kod samego formularza w HTML:

<form action="php/send-email.php" method="post" onsubmit="if (this.imie_nazwisko.value == '' || this.gmail.value == '' || this.telefon.value == '' || this.wiadomosc.value == '' || this.mailnadawcy.value == ''){ alert('Zanim wyślesz formularz, musisz wypełnić wymagane pola! Wymagane pola oznaczone są gwiazdką.'); return false }">
                   
                    <input name="imie_nazwisko" type="text" placeholder="Imię i nazwisko*">
                    
                    <input name="gmail" type="text" placeholder="Adres e-mail*">
                    
                    <input name="telefon" type="text" placeholder="Numer telefonu">

                    <textarea name="wiadomosc" placeholder="Treść wiadomości*"></textarea>
                    
                    <input name="human" placeholder="*Ile jest 2+2?">
                    
                    <input id="submit" name="submit" type="submit" value="Wyślij Wiadomość">
                </form>
<?= recaptcha_get_html(CAPTCHA_KEY) ?>

Wklej to zamiast

<input name="human" placeholder="*Ile jest 2+2?">

Zamiast swojej obsługi formularza wklej to:

require_once 'recaptchalib.php';
define('CAPTCHA_KEY', 'KLUCZ reCaptcha');
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
  try {
    // weryfikacja
    if (!isset($_POST['submit'])) {
      throw new Exception('Brak klucza submit', 0x1);
    }
    if (!recaptcha_check_answer(CAPTCHA_KEY, $_SERVER['REMOTE_ADDR'], $_POST['recaptcha_challenge_field'], $_POST['recaptcha_response_field'])->is_valid) {
      throw new Exception('Błędny kod reCaptcha', 0x2);
    }
    foreach($_POST as &$val) {
      $val = strip_tags($val); // to wytnie kod html z wiadomości
    }
    //etc, etc, ...
    $headers = array(); // lub [] zależnie od wersji PHP
    $headers[] = sprintf('%s: %s', 'From', 'e-mail nadawcy');
    // uzupełnij nagłówki
    $message = 'TREŚĆ WIADOMOŚCI';
   if (mail('treash@op.pl', 'Wiadomość z formularza kontaktowego', $message, implode("\r\n", $headers))) {
     echo 'Wiadomość została wysłana';
   } else {
     throw new Exception('Wystąpił problem z wysyłką wiadomości', 0x10);
   }
  } catch(Exception $e) {
    printf('%d: %s', $e->getCode(), $e->getMessage());
  }
}

Wszystkiego za Ciebie nie zrobię, ale większość masz tutaj wyjaśnione/zrobione.

Wiesz co nadal nie bardzo wiem jak moją formę pliku sendmail.php połączyć z tym co mi podałeś…jakaś podpowiedź jeszcze? Mam całkiem wywalić zawartość mojego plik sendmail.php i zastąpić go tym:

require_once 'recaptchalib.php';
define('CAPTCHA_KEY', 'KLUCZ reCaptcha');
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
  try {
    // weryfikacja
    if (!isset($_POST['submit'])) {
      throw new Exception('Brak klucza submit', 0x1);
    }
    if (!recaptcha_check_answer(CAPTCHA_KEY, $_SERVER['REMOTE_ADDR'], $_POST['recaptcha_challenge_field'], $_POST['recaptcha_response_field'])->is_valid) {
      throw new Exception('Błędny kod reCaptcha', 0x2);
    }
    foreach($_POST as &$val) {
      $val = strip_tags($val); // to wytnie kod html z wiadomości
    }
    //etc, etc, ...
    $headers = array(); // lub [] zależnie od wersji PHP
    $headers[] = sprintf('%s: %s', 'From', 'e-mail nadawcy');
    // uzupełnij nagłówki
    $message = 'TREŚĆ WIADOMOŚCI';
    if (mail('treash@op.pl', 'Wiadomość z formularza kontaktowego', $message, implode("\r\n", $headers))) {
      echo 'Wiadomość została wysłana';
    } else {
      throw new Exception('Wystąpił problem z wysyłką wiadomości', 0x10);
    }
  } catch(Exception $e) {
    printf('%d: %s', $e->getCode(), $e->getMessage());
  }
}

…a jak nagłówki uzupełnić w jakiej formie?

 

PS. serwer obsługuje PHP 4/5.2/5.3/5.4

W pierwszym poście ustawiałeś nagłówki (co prawda robiłeś to już po fizycznej wysyłce wiadomości e-Mail.

$header = 'MIME-Version: 1.0' . "\r\n";
    $header .= 'Content-type: text/html; charset=utf-8' . "\r\n";
    $header .= 'From: '.$mailnadawcy.''."\r\n";

Czyli kod:

$headers[] = sprintf('%s: %s', 'From', 'e-mail nadawcy');

będzie wyglądać następująco:

$headers[] = sprintf('%s: %s', 'MIME-Version', '1.0');
$headers[] = sprintf('%s: %s', 'Content-Type', 'text/html; charset=utf-8');
$headers[] = sprintf('%s: %s', 'From', $mailnadawcy);

Teraz treść wiadomości:

$message = 'TREŚĆ WIADOMOŚCI';

zastąp

$message = sprintf('Imię i nazwisko: %s<br />gMail: %s<br />Telefon: %s<br />Treść wiadomości:<br />%s', $_POST['imie_nazwisko'], $_POST['gmail'], $_POST['telefon'], $_POST['wiadomosc']);

Pamiętaj także o wgraniu pliku recaptchalib.php i ustawieniu stałej z kluczem.

Czy cały kod będzie wyglądał tak, czy brakuje jeszcze czegoś? Bibliotekę recaptchalib.php wgrałem na serwer, wygenerowałem klucz poprzez konto google i wpisałem w miejsce KLUCZ reCaptcha’ , ale wywala mi info. “Błędny kod reCaptcha”.

<?php
require_once 'recaptchalib.php';
define('CAPTCHA_KEY', 'KLUCZ reCaptcha');
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
  try {
    // weryfikacja
    if (!isset($_POST['submit'])) {
      throw new Exception('Brak klucza submit', 0x1);
    }
    if (!recaptcha_check_answer(CAPTCHA_KEY, $_SERVER['REMOTE_ADDR'], $_POST['recaptcha_challenge_field'], $_POST['recaptcha_response_field'])->is_valid) {
      throw new Exception('Błędny kod reCaptcha', 0x2);
    }
    foreach($_POST as &$val) {
      $val = strip_tags($val); // to wytnie kod html z wiadomości
    }
    //etc, etc, ...
    $headers = array(); // lub [] zależnie od wersji PHP
    $headers[] = sprintf('%s: %s', 'MIME-Version', '1.0');
    $headers[] = sprintf('%s: %s', 'Content-Type', 'text/html; charset=utf-8');
    $headers[] = sprintf('%s: %s', 'From', $mailnadawcy);
    // uzupełnij nagłówki
    $message = sprintf('Imię i nazwisko: %s<br />Adres email: %s<br />Numer telefonu: %s<br />Treść wiadomości:<br />%s', $_POST['imie_nazwisko'], $_POST['gmail'], $_POST['telefon'], $_POST['wiadomosc']);
    if (mail('treash@op.pl', 'Wiadomość z formularza kontaktowego', $message, implode("\r\n", $headers))) {
      echo 'Wiadomość została wysłana';
    } else {
      throw new Exception('Wystąpił problem z wysyłką wiadomości', 0x10);
    }
  } catch(Exception $e) {
    printf('%d: %s', $e->getCode(), $e->getMessage());
  }
}
?>

…i jeszcze teraz nie wiem jak mam zrobić te recaptcha tzn. jak to w HTML-u zrobić bo obecnie nic nie mam poza moimi polami i jak wysyłam mówi że jest błędny kod recaptcha? Kurcze dzisiaj z tym już tyle walczyłem że mam dość, więc chętnie skorzystam z Twojej pomocy żeby zakończyć ten formularz.

 

Aha a tu mój kod HTML formularza:

<form action="php/send.php" method="post" onsubmit="if (this.imie_nazwisko.value == '' || this.gmail.value == '' || this.telefon.value == ''  
|| this.wiadomosc.value == '' || this.mailnadawcy.value == ''){ alert('Zanim wyślesz formularz, musisz wypełnić wymagane pola! Wymagane pola 
oznaczone są gwiazdką.'); return false }">
                
   <input name="imie_nazwisko" type="text" placeholder="Imię i nazwisko*">
                    
   <input name="gmail" type="text" placeholder="Adres e-mail*">
                    
   <input name="telefon" type="text" placeholder="Numer telefonu">

   <textarea name="wiadomosc" placeholder="Treść wiadomości*"></textarea>
                    
   <?= recaptcha_get_html(CAPTCHA_KEY) ?>
                    
   <input id="submit" name="submit" type="submit" value="Wyślij Wiadomość">
</form>
require_once 'recaptchalib.php';

załadowany w pliku z formularzem?

Podejrzewam, że w Twoim przypadku będzie to:

require_once 'php/recaptchalib.php';

Pamiętaj, że stała z kluczem captcha musi być dostępna w pliku z formularzem.

Ścieżki mam dobrze ustawione, a i sam klucz jest w pliku wysyłki sendmail.php formularza…