[PHP] Creare Honeypot per form contatti

Tom&Jerry

Nuovo Utente
26 Giu 2019
5
0
1
Buongiorno, non ho grande dimestichezza con il PHP e sto cercando di creare un Honeypot per limitare lo spam che sto ricevendo. Vi includo il form PHP nel quale si trova il problema, il pezzo di codice CSS e quello HTML con il form. Ciò che devo fare è nascondere il campo TELEFONO (come da CSS) e far in modo che se viene compilato in automatico da un bot il form dia errore.
Vi ringrazio fin da ora per l'assistenza e rimango a disposizione per chiarire eventuali aspetti. Marco

HTML:
<style>
    .ohnohoney{
        opacity: 0;
        position: absolute;
        top: 0;
        left: 0;
        height: 0;
        width: 0;
        z-index: -1;
    }
</style>


HTML:

 <p class="data"><strong>Nome e Cognome</strong><br />
      <input type="text" size="21" name="requirednome" background-color="FFF">
    <br />
      <strong><br />Indirizzo e-mail</strong><br />
      <input type="text" size="21" name="requiredemail" background-color="FFF">
    <br />
      <strong><br />Messaggio</strong><br />
      <textarea name="requiredmessaggio" background-color="FFF" rows="9" cols="17" wrap="virtual"></textarea>
    <br />
      <input type="text" name="telefono" class="ohnohoney" placeholder="Telefono">
    </p>

PHP:
<html>
<head>
<title>Conferma invio messaggio</title>

</head>
<body><?php
//*******************************************************************************************
//***********************************RIGHE DA MODIFICARE*************************************
$oggetto = "Email dal web";                //L'oggetto con cui vuoi che ti arrivi la mail
$indirizzo_dest ="test@sitomio.com";   //L'indirizzo di posta a cui arriveranno i messaggi inviati dal form
//***********************NON MODIFICARE NIENTE AL DI SOTTO DI QUESTA RIGA*********************

$header .="From: <".$_GET['requiredemail'].">";  //qsta riga serve per fare in modo che $email sia visto cm mittente 
$messaggio = $_GET['requiredmessaggio']. " 
$telefono = $_GET['telefono']. " 

Nome: ".$_GET['requirednome']." 
Nome: ".$_GET['telefono']." 
Email: ".$_GET['requiredemail'];  //seconda parte dell'header


if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
    $ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
    $ip = $_SERVER['REMOTE_ADDR'];
}

$messaggio .=
"
IP: ". $ip . "
Browser: ". $_SERVER['HTTP_USER_AGENT'] ;

    if(mail($indirizzo_dest, $oggetto, $messaggio, $header))
    {
        include 'conferma.html';
    }
    else
    {
        print("<center><br><br><br><font size='5' color='#FF0000'>Si è verificato un errore durante l'invio dell'email, si prega di tornare alla pagina precedente e riprovare.</center></font>");
   
    }
    if(mail($indirizzo_dest, $oggetto, $messaggio, $header, $telefono))
    {
        print("<center><br><br><br><font size='5' color='#FF0000'>Si è verificato un errore durante l'invio dell'email, si prega di tornare alla pagina precedente e riprovare.</center></font>");
   
    }

?>
</body>
</html>
 
Ultima modifica:

mr.x

Utente Attivo
9 Apr 2016
230
22
28
Ciao Marco,
hai pensato di inserire n CAPTCHA?

riguardo nascondere il campo telefono puoi farlo da css (inserendo nella classe .ohnohoney dispaly:none;) .. però se nn ti serve tale voce potresti anche toglierla.
 

Tom&Jerry

Nuovo Utente
26 Giu 2019
5
0
1
Non mi interessa il CAPTCHA, crea solo problemi a chi spedisce. Il parametro display:none non va bene perchè ormai i bot lo riconoscono e bypassano, in ogni caso il problema non è lì perchè il campo telefono è già nascosto con i settaggi che ho riportato. Il problema è nel file PHP nella doppia condizione e non riesco a capire come risolverlo.
Devo fare in modo che se vengono compilati i campi $indirizzo_dest, $oggetto, $messaggio e $header allora viene richiamata la pagina conferma.html, mentre se oltre a quelli viene compilato anche il campo $telefono il modulo deve dare errore
 
Ultima modifica:

Max 1

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
29 Feb 2012
4.005
295
83
@Tom&Jerry
Da regolamento del forum, come tutti noi sei tenuto ad usare il tag
o il tag
per il PHP, quando posti del codice, oppure la funzione codice dalla barra degli strumenti


Inoltre ti prego e sei tenuto di leggere attentamente il regolamento generale del forum e quello di sezione dove posti
Grazie
Per questa volta te lo sistemo io ma mi raccomando per il futuro
 

mr.x

Utente Attivo
9 Apr 2016
230
22
28
Il problema è nel file PHP nella doppia condizione e non riesco a capire come risolverlo.
Devo fare in modo che se vengono compilati i campi $indirizzo_dest, $oggetto, $messaggio e $header allora viene richiamata la pagina conferma.html, mentre se oltre a quelli viene compilato anche il campo $telefono il modulo deve dare errore
Scusa ma forse ti sei perso qualche pezzo di codice mentre lo copiavi, quale sarebbe la doppia condizione? Di controlli non ne vedo sui valori postati tramite form..

dovresti inserire qualcosa del genere:
PHP:
// controllo che siano passati messaggio, nome ed email non vuoti e che risulti non compilato il campo telefono
if (( $_GET['requiredmessaggio'] !="" ) && ($_GET['requirednome'] !="" ) && ( $_GET['requiredemail'] !="") && ($_GET['telefono'] =="")) {

// qui il codice per l'invio della mail

} else { echo "errore"; }
Comunque il codice che utilizzi va bene per un esercizio, se devi usarlo in produzione non è il massimo.. (a cominciare dal passaggio dei dati in GET alla mancanza totale di controlli su ciò che viene passato).
 

Tom&Jerry

Nuovo Utente
26 Giu 2019
5
0
1
Non funziona ancora, il problema è nel file PHP. Riscrivo tutto il codice, magari esce l'errore che non riesco a trovare in quanto mi dà ERRORE 500 e potrebbe trattarsi di un problema di sintassi da qualche parte.

PHP:
<html>
<head>
<title>Conferma invio messaggio</title>

</head>
<body><?php
//*******************************************************************************************
//***********************************RIGHE DA MODIFICARE*************************************
$oggetto = "Email dal web";                //L'oggetto con cui vuoi che tiarrivi la mail
$indirizzo_dest ="test@sitomio.com";   //L'indirizzo di posta a cui arriveranno i messaggi inviati dal form   
//***********************NON MODIFICARE NIENTE AL DI SOTTO DI QUESTA RIGA*********************

$header .="From: <".$_GET['requiredemail'].">";  //qsta riga serve per fare in modo che $email sia visto cm mittente
$messaggio = $_GET['requiredmessaggio']. "
$telefono = $_GET['telefono']. "

Nome: ".$_GET['requirednome']."
Nome: ".$_GET['telefono']."
Email: ".$_GET['requiredemail'];  //seconda parte dell'header


if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
    $ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
    $ip = $_SERVER['REMOTE_ADDR'];
}

$messaggio .=
"
IP: ". $ip . "
Browser: ". $_SERVER['HTTP_USER_AGENT'] ;

    // controllo che siano passati messaggio, nome ed email non vuoti e che risulti non compilato il campo telefono
        if (( $_GET['requiredmessaggio'] !="" ) && ($_GET['requirednome'] !="" ) && ( $_GET['requiredemail'] !="") && ($_GET['telefono'] =="")) {

        include 'conferma.html';
    } else { echo "errore"; }

?>
</body>
</html>
 

mr.x

Utente Attivo
9 Apr 2016
230
22
28
PHP:
<?php

// controllo che siano passati messaggio, nome ed email non vuoti e che risulti non compilato il campo telefono
if (( $_GET['requiredmessaggio'] !="" ) && ($_GET['requirednome'] !="" ) && ( $_GET['requiredemail'] !="") && ($_GET['telefono'] =="")) {

// qui il codice per l'invio della mail

//*******************************************************************************************
//***********************************RIGHE DA MODIFICARE*************************************
$oggetto = "Email dal web";                //L'oggetto con cui vuoi che tiarrivi la mail
$indirizzo_dest ="test@sitomio.com";   //L'indirizzo di posta a cui arriveranno i messaggi inviati dal form  
//***********************NON MODIFICARE NIENTE AL DI SOTTO DI QUESTA RIGA*********************

$header .="From: <".$_GET['requiredemail'].">";  //qsta riga serve per fare in modo che $email sia visto cm mittente
$messaggio = $_GET['requiredmessaggio'].
$telefono = $_GET['telefono']. "

Nome: ".$_GET['requirednome']."
Nome: ".$_GET['telefono']."
Email: ".$_GET['requiredemail'];  //seconda parte dell'header


if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
    $ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
    $ip = $_SERVER['REMOTE_ADDR'];
}

$messaggio .=
"
IP: ". $ip . "
Browser: ". $_SERVER['HTTP_USER_AGENT'] ;

    if(mail($indirizzo_dest, $oggetto, $messaggio, $header))
    {
        include 'conferma.html';
    }
    else
    {
        print("<center><br><br><br><font size='5' color='#FF0000'>Si è verificato un errore durante l'invio dell'email, si prega di tornare alla pagina precedente e riprovare.</center></font>");
 
    }



} else { echo "errore"; }

?>
 

Tom&Jerry

Nuovo Utente
26 Giu 2019
5
0
1
Ti ringrazio per la risposta. Purtroppo non sono un grande conoscitore di PHP quindi di chiedo un'ultima cortesia: cosa devo scrivere al posto di // qui il codice per l'invio della mail ? Ho necessità di richiamare la pagina "conferma.html", come specificato nella condizione IF sottostante. Grazie
 

mr.x

Utente Attivo
9 Apr 2016
230
22
28
Quella riga puoi anche toglierla, me la son portata dietro dal post precedente. Ho inserito io il codice all'interno vedendo che avevi trovato difficoltà.


P.s.
Al posto dell'include potreti utilizzare un redirect.

Sostituisci quella riga con

PHP:
header("location: confrma.html");
exit;
 
Ultima modifica:

Tom&Jerry

Nuovo Utente
26 Giu 2019
5
0
1
Grazie infinite, ora funziona tutto correttamente. Ho solo un'ultima cosa da chiederti, giusto per mia informazione personale:
ho sostituito la riga
PHP:
include 'conferma.html';
con
PHP:
header("location: conferma.html");
exit;
lasciando poi invariato il resto fino alla fine del file e funziona, ho notato però che funziona anche senza la stringa "exit;", è normale ?
 

mr.x

Utente Attivo
9 Apr 2016
230
22
28
si è normale, header() non blocca lo scroll della pagina, exit serve appunto a terminare lo script.