Pagina 1 di 6 123 ... UltimoUltimo
Visualizzazione risultati 1 fino 30 di 155

Discussione: Bloccare email spam

  1. #1
    Guest

    Predefinito Bloccare email spam

    Sto creando un codice per bloccare le email spam che l'utente inserisce nel form, ma l'invio va sempre a buon fine.

    Ho creato un file esterno con un codice di prova:

    Codice:
    <?php
    $emailSpam = array (
    "*@xxx.it"
    );
    ?>
    Richiamo il file include ("parole-proibiteX.php"); che contiene il codice

    Codice:
    include ("parole-proibiteX.php");
    ...
    $suoemail = htmlspecialchars(strtolower($_POST['suoemail']));
    
    //Email spam
    if ($suoemail == "$emailSpam") { 
    $errore .= "Questa email non è accettata";
      }
    if ($errore) {
    $ritenta ="$errore"; 
    $ritenta .="<meta http-equiv=\"refresh\" content=\"2; url=index.php?ritorna_scrivimi\">"; 
    }
    else {
    $meta = "Messaggio inviato!"; 
    $meta .= "<meta http-equiv=\"refresh\" content=\"2; url=index.php\">"; 
    $_SESSION=array();
    Ultima modifica di photoman : 16-04-2016 alle ore 05.17.37

  2. #2
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Assumendo che $suoemail contenga il corpo del messaggio scritto dall'utente:
    Codice PHP:
    $emailSpam = array (
    "*@xxx.it"
    );
    ...
    if (
    $suoemail == "$emailSpam") {
    $errore .= "Questa email non è accettata";
    }
    $emailSpam è un vettore, cercare di convertirlo a stringa in quel modo è un errore (PHP Notice: Array to string conversion).
    Sorvolando sulla conversione, questo codice significa se e solo se il testo dell'email è un vettore contenente esattamente un solo elemento, di tipo stringa, il cui valore è precisamente "*@xxx.it", allora considera l'email come spam. Il testo dell'email non è mai un vettore, quindi il controllo fallisce sempre.

    Immagino che ciò che tu voglia sia se il corpo del messaggio contiene almeno uno dei pattern proibiti, consideralo come spam:
    Codice PHP:
    function is_spam($text) {
    $patterns = array(...); // From "parole-proibiteX.php"

    // Returns true at first match
    foreach ($patterns as $pattern) {
    if (
    preg_match($pattern, $text)) {
    return
    true;
    }
    }

    return
    false;
    }
    Questa funzione restituisce true se e solo se il testo passatole contiene almeno uno dei pattern proibiti (intesi come espressioni regolari), false altrimenti.
    Guarda la documentazione di preg_match per capire come costruire un'espressione regolare da usare nel match.
    Se ti interessa verificare la presenza di alcune parole e non di un pattern dovresti invece usare strpos.


    Detto questo, costruire a mano un filtro anti-spam non è così semplice, la sola presenza di una parola "tabù" non è sufficiente a classificare un messaggio come spam (possono accadere, ad esempio, errori di battitura, parole classificate come proibite ma giustificate dal contesto, ed altri falsi positivi). Se vuoi uno strumento di qualità accettabile, dovresti implementare un filtro Bayesiano.
    Altrimenti puoi usare soluzioni già pronte, e disporre delle misure preventive (codice captcha contro i bot, permettere l'invio solo ad utenti autenticati, eccetera).

  3. #3
    Guest

    Predefinito

    A me interessa che venga intercettato il dominio dell'email. A volte mi scrivono con il form che ho nel sito, ma inseriscono un'email non vera.

  4. #4
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Ah, quindi non è un filtro anti-spam che cerchi!
    Se ho capito bene, vuoi bloccare le email quando un utente dichiara un indirizzo email non veritiero. Controllare la veridicità di un indirizzo non è possibile, ma puoi confrontare il dominio con una balcklist:

    Codice PHP:
    function get_domain($address) {
    if (
    filter_var($address, FILTER_VALIDATE_EMAIL) === false) {
    return
    "";
    }

    return
    array_pop(explode('@', $address));
    }

    function
    in_blacklist($domain) {
    $blacklist = array("xxx.it", "yyy.com", ...);

    return
    in_array($domain, $blacklist);
    }

    ...
    $email = ...;
    $domain = get_domain($email);
    if (empty(
    $domain) || in_blacklist($domain)) {
    // Reject
    }
    get_domain restituisce il dominio di un indirizzo email, oppure la stringa nulla se questo non è un indirizzo valido.
    in_blacklist restituisce true se e solo se il dominio appartiene ad una blacklist, false altrimenti.
    Usando quel controllo rifiuti domini nulli o presenti nella blacklist.

  5. #5
    Guest

    Predefinito

    Ok, non riesco ad applicare il codice al mio e cioè questi 2 :

    Codice PHP:
    $suoemail
    $errore
    .= "&bull;&nbsp;&nbsp;Questa email non &egrave; accettata<br><br>";

  6. #6
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Non mi è chiaro cosa intendi.
    $suoemail equivale alla variabile che ho indicato come $email, puoi ottenerla come già facevi leggendo da $_POST.
    Per aggiornare il contenuto di $errore in caso di indirizzo email rifiutato, devi inserire l'aggiornamento della variabile al posto del commento "Reject", nell'ultimo controllo.
    Per il resto, il codice che già avevi funziona:
    Codice PHP:
    ...
    $email = strtolower($_POST['suoemail']);
    $domain = get_domain($email);

    // Checks domain against a blacklist
    if (empty($domain) || in_blacklist($domain)) {
    $errore .= "Questa email non è accettata";
    }

    if (
    $errore) {
    $ritenta ="$errore";
    $ritenta .="<meta http-equiv=\"refresh\" content=\"2; url=index.php?ritorna_scrivimi\">";
    }
    else {
    $meta = "Messaggio inviato!";
    $meta .= "<meta http-equiv=\"refresh\" content=\"2; url=index.php\">";
    $_SESSION = array();
    ...
    Naturalmente c'è sempre spazio per i miglioramenti. Ad esempio, non so perché venga citata la sessione, ma per svuotarla non sarebbe meglio usare session_destroy?

  7. #7
    Guest

    Predefinito

    Io per validare l'email ho già questo:

    Codice PHP:
    if ($suoemail) {
    if (!
    preg_match("/^[^.-]([.]?[^.-]+)*([-][^.-])?([.]?[^.-])*@(.*)[^.](\.[a-z]{2,6})$/",$suoemail)) {
    $errore .= "Inserire un'email valida";
    }
    }
    ...
    Così funziona:

    Codice PHP:
    function get_domain($address) {
    if (
    filter_var($address, FILTER_VALIDATE_EMAIL) === false) {
    return
    "";
    }
    return
    array_pop(explode('@', $address));
    }
    function
    in_blacklist($domain) {
    $blacklist = array("xxx.it", "yyy.com");
    return
    in_array($domain, $blacklist);
    }
    $domain = get_domain($suoemail);
    if (empty(
    $domain) || in_blacklist($domain)) {
    $errore .= "&bull;&nbsp;&nbsp;Questa email non &egrave; accettata<br><br>";
    }
    Ora si tratta di mettere questo al posto giusto include ("email_spam.php");

    Questo è il suo array
    Codice PHP:
    <?php
    $blacklist
    = array (
    '*@xxx.it',
    '*@yyy.com'
    );
    Ultima modifica di photoman : 17-04-2016 alle ore 01.42.55

  8. #8
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Se vuoi mantenere l'idea di usare un vettore globale, l'inclusione di email_spam.php può essere fatta in qualunque punto prima della dichiarazione di in_blacklist, la quale deve però essere così modificata poiché stai usando una variabile globale:
    Codice PHP:
    function in_blacklist($domain) {
    global
    $blacklist;

    return
    in_array($domain, $blacklist);
    }

    In alternativa (senza "scomodare" una variabile globale) puoi salvare i domini in un file di testo e leggerli all'occorrenza:

    blacklist.txt:
    Codice:
    xxx.com
    yyy.it
    zzz.cn
    Poi, nel codice:
    Codice PHP:
    function in_blacklist($domain) {
    $blacklist = file("blacklist.txt", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
    if (
    $blacklist === false) {
    $blacklist = array();
    }

    return
    in_array($domain, $blacklist);
    }
    In ogni caso, gli elementi nella blacklist devono essere nomi di domini, quindi "xxx.com", non "*@xxx.com".

  9. #9
    Guest

    Predefinito

    Ho usato il primo esempio e funziona. Ho notato che questa regex non mi valida alcuni domini, eppure (.*) vuol dire "qualsiasi cosa"


    Codice PHP:
    if ($suoemail) {
    if (!
    preg_match("/^[^.-]([.]?[^.-]+)*([-][^.-])?([.]?[^.-])*@(.*)[^.](\.[a-z 0-9]{2,6})$/",$suoemail)) {
    $errore .= "&bull;&nbsp;&nbsp;Inserire un'email valida<br><br>";
    }
    }
    Non accetta:

    12minutemail.com

    Accetta:

    12minute.com
    Ultima modifica di photoman : 17-04-2016 alle ore 13.43.30

  10. #10
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    Ciao non mi è ben chiaro cosa volessi fare con quella regex.
    EDIT: io con una email prova@12minutemail.com e la regex proposta da te
    Codice PHP:
    $criterio = '/^[^.-]([.]?[^.-]+)*([-][^.-])?([.]?[^.-])*@(.*)[^.](\.[a-z 0-9]{2,6})$/';
    mi da "email non valida",boh.
    Io userei una regex per validare l'email è successivamente hai anche il dominio (ma di una email valida).
    Codice PHP:
    <?php
    if(isset($_POST['suoemail'])){
    $max = 50;
    if(
    $max >= strlen($_POST['suoemail'])){
    $testo = strtolower($_POST['suoemail']);


    //single quote
    //$criterio = '/^([a-zA-Z0-9_.\-])+@([a-zA-Z0-9\-]{2,})\.([a-zA-Z0-9]{2,})$/';
    //double quote
    $criterio = "/^([a-zA-Z0-9_.\\-])+@([a-zA-Z0-9\\-]{2,})\\.([a-zA-Z0-9]{2,})\$/";
    $valida = preg_match ( $criterio , $testo , $testi_riconosciuti);


    if(
    $valida){
    $a = '.';
    print_r($testi_riconosciuti);
    echo
    "<br>dominio $testi_riconosciuti[2]$a$testi_riconosciuti[3]<br>";
    var_dump($criterio);
    }else{
    echo
    'email non valida';
    }
    }
    else {
    echo
    'email troppo lunga';
    }
    }

    ?>
    la prima parentesi tonda memorizza l'ultimo carattere permesso nella classe "[]",prima della @, la seconda recupera i caratteri dopo @ prima del punto, la terza i restanti caratteri per il dominio.
    Ultima modifica di darbula : 18-04-2016 alle ore 03.32.54

  11. #11
    Guest

    Predefinito

    Ho trovato un'email in rete e così sembra funzionare

    Codice PHP:
    //Email (Campo obbligatorio)
    if ($suoemail == "") {
    $errore .= "&bull;&nbsp;&nbsp;Inserire l'email<br><br>";
    }
    if (
    $suoemail) {
    if (!
    preg_match('/^(([^<>()\[\]\\.,;:\s@"-]+((\.|\-)[^<>()\[\]\\.,;:\s@"-]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/',$suoemail)) {

    $errore .= "&bull;&nbsp;&nbsp;Inserire un'email valida<br><br>";
    }
    }
    //Email spam
    function get_domain($address) {
    return
    array_pop(explode('@', $address));
    }
    function
    in_blacklist($domain) {
    global
    $blacklist;
    return
    in_array($domain, $blacklist);
    }
    $domain = get_domain($suoemail);
    if (empty(
    $domain) || in_blacklist($domain)) {
    $errore .= "&bull;&nbsp;&nbsp;Questa email non &egrave; accettata<br><br>";
    }
    Ultima modifica di photoman : 18-04-2016 alle ore 05.51.54

  12. #12
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Non c'è motivo di scrivere a mano un'espressione regolare per controllare la validità di un indirizzo. filter_var lo fa già molto meglio delle espressioni regolari proposte nei messaggi precedenti:
    Codice PHP:
    filter_var($email, FILTER_VALIDATE_EMAIL);
    Per "molto meglio", intendo dire che le espressioni regolari proposte non sono complete, ovvero funzionano con alcuni indirizzi email, ma possono produrre falsi negativi.
    Volendo fare questo controllo con le espressioni regolari, il codice diventa di una lunghezza e complessità non banali:
    Codice PHP:
    function validate_email($email, $strict = true) {
    $dot_string = $strict ?
    '(?:[A-Za-z0-9!#$%&*+=?^_`{|}~\'\\/-]|(?<!\\.|\\A)\\.(?!\\.|@))' :
    '(?:[A-Za-z0-9!#$%&*+=?^_`{|}~\'\\/.-])'
    ;
    $quoted_string = '(?:\\\\\\\\|\\\\"|\\\\?[A-Za-z0-9!#$%&*+=?^_`{|}~()<>[\\]:;@,. \'\\/-])';
    $ipv4_part = '(?:[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])';
    $ipv6_part = '(?:[A-fa-f0-9]{1,4})';
    $fqdn_part = '(?:[A-Za-z](?:[A-Za-z0-9-]{0,61}?[A-Za-z0-9])?)';
    $ipv4 = "(?:(?:{$ipv4_part}\\.){3}{$ipv4_part})";
    $ipv6 = '(?:' .
    "(?:(?:{$ipv6_part}:){7}(?:{$ipv6_part}|:))" . '|' .
    "(?:(?:{$ipv6_part}:){6}(?::{$ipv6_part}|:{$ipv4}|:))" . '|' .
    "(?:(?:{$ipv6_part}:){5}(?:(?::{$ipv6_part}){1,2}|:{$ipv4}|:))" . '|' .
    "(?:(?:{$ipv6_part}:){4}(?:(?::{$ipv6_part}){1,3}|(?::{$ipv6_part})?:{$ipv4}|:))" . '|' .
    "(?:(?:{$ipv6_part}:){3}(?:(?::{$ipv6_part}){1,4}|(?::{$ipv6_part}){0,2}:{$ipv4}|:))" . '|' .
    "(?:(?:{$ipv6_part}:){2}(?:(?::{$ipv6_part}){1,5}|(?::{$ipv6_part}){0,3}:{$ipv4}|:))" . '|' .
    "(?:(?:{$ipv6_part}:){1}(?:(?::{$ipv6_part}){1,6}|(?::{$ipv6_part}){0,4}:{$ipv4}|:))" . '|' .
    "(?::(?:(?::{$ipv6_part}){1,7}|(?::{$ipv6_part}){0,5}:{$ipv4}|:))" .
    ')';
    $fqdn = "(?:(?:{$fqdn_part}\\.)+?{$fqdn_part})";
    $local = "({$dot_string}++|(\"){$quoted_string}++\")";
    $domain = "({$fqdn}|\\[{$ipv4}]|\\[{$ipv6}]|\\[{$fqdn}])";
    $pattern = "/\\A{$local}@{$domain}\\z/";
    return
    preg_match($pattern, $email, $matches) &&
    (
    !empty(
    $matches[2]) && !isset($matches[1][66]) && !isset($matches[0][256]) ||
    !isset(
    $matches[1][64]) && !isset($matches[0][254])
    )
    ;
    }
    (fonte: filter_var)


    Altra osservazione: hai modificato la funzione get_domain che avevo proposto, ma così facendo ora non è più necessariamente corretta:
    Codice PHP:
    function get_domain($address) {
    return
    array_pop(explode('@', $address));
    }
    Ad esempio, passandole la stringa "@it@com" restituisce "com", mentre il comportamento atteso è la restituzione della stringa nulla "".
    Nel tuo codice non è un gran problema (poiché effettui un controllo precedente, quindi l'errore viene comunque segnalato), ma questo rende la funzione non riutilizzabile.

  13. #13
    Guest

    Predefinito

    Qui sono un po' confuso. Riassumendo, come lo metteresti tu questo blocco?

    Codice PHP:
    //Email (Campo obbligatorio)
    if ($suoemail) {
    if (!
    preg_match('/^(([^<>()\[\]\\.,;:\s@"-]+((\.|\-)[^<>()\[\]\\.,;:\s@"-]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/',$suoemail)) {
    $errore .= "&bull;&nbsp;&nbsp;Inserire un'email valida<br><br>";
    }
    }
    //Email spam
    function get_domain($address) {
    return
    array_pop(explode('@', $address));
    }
    function
    in_blacklist($domain) {
    global
    $blacklist;
    return
    in_array($domain, $blacklist);
    }
    $domain = get_domain($suoemail);
    if (empty(
    $domain) || in_blacklist($domain)) {
    $errore .= "&bull;&nbsp;&nbsp;Questa email non &egrave; accettata<br><br>";
    }
    Tutto il blocco sopra l'ho trasformato così e sembra funzionare, ma mi accetta il trattino all'inizio dell'username

    Codice PHP:
    function get_domain($address) {
    if (
    filter_var($address, FILTER_VALIDATE_EMAIL) === false) {
    return
    "";
    }
    return
    array_pop(explode('@', $address));
    }
    function
    in_blacklist($domain) {
    global
    $blacklist;
    return
    in_array($domain, $blacklist);
    }
    $domain = get_domain($suoemail);
    if (empty(
    $domain) || in_blacklist($domain)) {
    $errore .= "&bull;&nbsp;&nbsp;Inserire un'email valida<br><br>";
    }
    Ultima modifica di photoman : 18-04-2016 alle ore 13.13.25

  14. #14
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Qui sono un po' confuso. Riassumendo, come lo metteresti tu questo blocco?
    Così:
    Codice PHP:
    // Returns domain of an email address, or empty string
    function get_domain($address) {
    if (
    filter_var($address, FILTER_VALIDATE_EMAIL) === false) {
    return
    "";
    }

    return
    array_pop(explode('@', $address));
    }

    // Tells whether a domain is blacklisted
    function in_blacklist($domain) {
    global
    $blacklist;

    return
    in_array($domain, $blacklist);
    }

    ...

    $domain = get_domain($suoemail);

    if (empty(
    $suoemail)) {
    $errore .= "&bull;&nbsp;&nbsp;Inserire l'email<br><br>";
    }

    else {
    if (
    filter_var($suoemail, FILTER_VALIDATE_EMAIL) === false) {
    $errore .= "&bull;&nbsp;&nbsp;Inserire un'email valida<br><br>";
    }

    elseif (empty(
    $domain) || in_blacklist($domain)) {
    $errore .= "&bull;&nbsp;&nbsp;Questa email non &egrave; accettata<br><br>";
    }
    }

  15. #15
    Guest

    Predefinito

    Ok, funziona, così quando escono nuovi standard di validazione io non devo aggiornare il codice.
    Ho ancora una cosa: devo applicare FILTER_VALIDATE_EMAIL al var reg del js, ho questo

    Codice PHP:
    //Email (Campo obbligatorio)
    function emailCampo() {
    var
    f = document.forms.mioform1;
    if (
    f.suoemail.value == "") {
    f.suoemail.style.borderColor='black'
    f.suoemail.style.backgroundColor='#d8ecff'
    document.getElementById('emailCampo').innerHTML = "&bull;&nbsp;&nbsp;Inserire l'email";
    f.suoemail.focus();
    return
    false;
    }
    else {
    document.getElementById('emailCampo').innerHTML = "";
    }
    return
    true;
    }

    function
    validaMail() {
    var
    f = document.forms.mioform1;
    if (
    f.suoemail.value.length != 0) {
    var
    reg = /^(([^<>()\[\]\\.,;:\s@"-]+((\.|\-)[^<>()\[\]\\.,;:\s@"-]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
    if (!
    f.suoemail.value.match(reg)) {
    f.suoemail.style.borderColor='black'
    f.suoemail.style.backgroundColor='#d8ecff'
    document.getElementById('validaMail').innerHTML = "&bull;&nbsp;&nbsp;Inserire un'email valida";
    f.suoemail.focus();
    return
    false;
    }
    else {
    document.getElementById('validaMail').innerHTML = "";
    }
    }
    else {
    document.getElementById('validaMail').innerHTML = "";
    }
    return
    true;
    }
    Ultima modifica di photoman : 18-04-2016 alle ore 21.36.07

  16. #16
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Dopo un bel po' di refactoring, il codice può essere semplificato come:
    Codice:
    function emailCampo() {
        var f       = document.forms.mioform1;
        var suomail = f.suomail;
        var msg     = document.getElementById('emailCampo');
        
        if (suoemail.value == "") {
            suoemail.style.borderColor = 'black';
            suoemail.style.backgroundColor = '#d8ecff';
            suoemail.focus();
            msg.innerHTML = "&bull;&nbsp;&nbsp;Inserire l'email";
            
            return false;
        }
        
        msg.innerHTML = "";
        return true;
    }
    
    function validaMail() {
        var f       = document.forms.mioform1;
        var suomail = f.suomail;
        var msg     = document.getElementById('validaMail');
        var reg     = /^(([^<>()\[\]\\.,;:\s@"-]+((\.|\-)[^<>()\[\]\\.,;:\s@"-]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
        
        
        msg.innerHTML = "";
        if (suoemail.value.length != 0 && !suoemail.value.match(reg)) {
            suoemail.style.borderColor = 'black';
            suoemail.style.backgroundColor = '#d8ecff';
            suoemail.focus();
            msg.innerHTML = "&bull;&nbsp;&nbsp;Inserire un'email valida";
            
            return false;
        }
        
        return true;
    }
    Il problema resta la validazione tramite espressione regolare. A differenza di PHP, in JavaScript non c'è una funzione nativa.
    L'idea migliore è usare input type="email" nell'HTML, lasciando stare JavaScript (il quale, comunque, può essere disattivato da uno spammer).

    Se la validazione con JavaScript è assolutamente irrinunciabile, si può fare qualcosa usando espressioni regolari, ma si tratta di crearne una "a mano" scegliendo arbitrariamente a quale standard aderire. Ad esempio: RFC 2822 compliant, oppure RFC 822 compliant.

  17. #17
    Guest

    Predefinito

    Il js lo uso come avviso iniziale. Ricordo che anni fa avevo un codice is che interagiva con php e funzionava bene. Nel mio caso si tratterebbe di creare un echo nel js <?php echo FILTER_VALIDATE_EMAIL; ?> Meglio ancora se jQuery o Ajax
    Ultima modifica di photoman : 19-04-2016 alle ore 01.44.40

  18. #18
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Per realizzare il controllo con AJAX, hai bisogno di una pagina PHP come:
    email_check.php
    Codice PHP:
    <?php
    header
    ('Content-Type: application/json');

    $true = json_encode(array("valid" => true));
    $false = json_encode(array("valid" => false));

    if (!isset(
    $_GET['address'])) {
    echo
    $false;
    return;
    }

    $address = $_GET['address'];
    echo (
    filter_var($address, FILTER_VALIDATE_EMAIL) === false) ? $false : $true
    ?>
    Lato client, con jQuery:
    Codice:
    function check_email(address, callback) {
        $.get( "email_check.php", { "address": address }, function( data ) {
            callback(data.valid);
        });
    }
    
    // Use your own callback function
    function my_callback(is_valid) {
        if (is_valid) {
            console.log("email is valid");
        } else {
            console.log("email is not valid");
        }
    }
    
    ...
    var address = document.getElementById(...).value;
    check_email(address, my_callback);
    ...
    my_callback è una funzione (che dovrai definire in base al comportamento atteso) il cui parametro è true se e solo se l'indirizzo email è valido, false altrimenti. Ad esempio, se vuoi stampare un messaggio di errore nel caso in cui l'indirizzo non sia valido, userai qualcosa come someElement.innerHTML = "Indirizzo non valido"; nel ramo else.
    check_email effettua la chiamata AJAX (o meglio, AJAJ) alla pagina PHP. I due argomenti sono l'indirizzo email da controllare e la funzione di callback da invocare quando la chiamata asincrona termina, alla quale verrà passato un valore booleano.
    Ultima modifica di mzanella : 19-04-2016 alle ore 08.02.53

  19. #19
    Guest

    Predefinito

    Per ora ho creato il file email_ckeck.php

    per darti un idea di cosa intendo fare, entra nel mio sito ed in fondo clicca su @Email e compila il form, se i campi obbligatori non sono corretti appare la scritta rossa, ma a me interessa solo il campo email. La scritta rossa che appare deve essere invece creata da Ajax tramite il FILTER_VALIDATE_EMAIL

    http://www.photoman.altervista.org/index.php
    Ultima modifica di photoman : 19-04-2016 alle ore 09.33.50

  20. #20
    Guest

    Predefinito

    mzanella, che faccio ora? Come dicevo, il file email_check.php l'ho messo, ora è la seconda parte da sistemare

  21. #21
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Hai provato ad integrare il codice JavaScript che ho indicato? Hai incontrato qualche difficoltà in particolare?

  22. #22
    Guest

    Predefinito

    Io ho fatto copia-incolla, ma non funziona, non so cosa modificare. Vedo che non fa uscire la scritta alert rossa sotto il campo, allora ho pensato che non va.
    Ultima modifica di photoman : 22-04-2016 alle ore 10.33.51

  23. #23
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Certo che il copia-e-incolla non funziona, è un codice di esempio!
    Devi modificare le parti indicate in base alle tue esigenze, ad esempio nella funzione di callback per stampare il messaggio d'errore.
    Ora, la domanda è, hai provato ad integrare le modifiche? Hai difficoltà nel modificare un codice JavaScript?

  24. #24
    Guest

    Predefinito

    Sto mettendo a punto questo codice, funziona, ma non intercetta esattamente il dominio che c'è nell'array.

    Se noi facciamo un codice simile ma che richiami FILTER_VALIDATE_EMAIL saremmo a posto senza usare Ajax, che dici?

    Codice PHP:
    <?php
    include ("email_spam.php");
    ?>
    <script>
    function spamMail() {
    var f = document.forms.mioform1;
    var xxx = new Array(<?php
    for($i=0;$i<count($blacklist)-1;$i++) echo "'{$blacklist [$i]}',";
    echo
    "'{$blacklist [count($blacklist )-1]}'";
    ?>);
    var f = document.forms.mioform1;
    for (var i = 0; i < xxx.length; i++)
    if (f.suoemail.value.indexOf (xxx[i]) != (-1)) {
    document.getElementById('spamMail').innerHTML = "&bull;&nbsp;&nbsp;Questa email non &egrave; accettata";
    f.suoemail.focus();
    return false;
    }
    else {
    document.getElementById('spamMail').innerHTML = "";
    }
    return true;
    }
    </script>
    Ultima modifica di photoman : 23-04-2016 alle ore 07.48.59

  25. #25
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Se noi facciamo un codice simile ma che richiami FILTER_VALIDATE_EMAIL saremmo a posto senza usare Ajax, che dici?
    Non è possibile "chiamare dinamicamente" una funzione PHP in questo modo, se non usando appunto AJAX et simila.
    Se e solo se c'è qualche motivazione particolare per non usare AJAX, si può cercare di aggirare il problema, ad esempio re-implementando una funzione filter_validate_email in JavaScript, ma si tratta pur sempre di una scappatoia, quindi comporta un certo numero di problemi.

    Ho visto che stai ripetendo il controllo sulla blacklist in JavaScript. A questo punto non sarebbe più semplice lasciare tutti i controlli ad una pagina PHP, ed servirsi AJAX per richiamarla, effettuando il controllo on-demand?

  26. #26
    Guest

    Predefinito

    Vorresti dire che i controlli php verrebbero richiamati in js con Ajax? Difatti è proprio quello che vorrei fare: avere gli stessi identici controlli sia in php che in js. Naturalmente non per tutti i campi, solo per le cose difficili, email e url (questo è nel form del guestbook)

  27. #27
    darbula non è connesso AlterGuru 2500
    Data registrazione
    24-04-2011
    Messaggi
    2,894

    Predefinito

    aspetta @photoman stai inserendo javascript come codice php è non un file a parte? Perché così cambia le cose.

  28. #28
    Guest

    Predefinito

    Sto aspettando mzanella sul da farsi

  29. #29
    mzanella non è connesso AlterGuru
    Data registrazione
    29-12-2015
    Messaggi
    1,954

    Predefinito

    Citazione Originalmente inviato da photoman Visualizza messaggio
    Vorresti dire che i controlli php verrebbero richiamati in js con Ajax? Difatti è proprio quello che vorrei fare: avere gli stessi identici controlli sia in php che in js. Naturalmente non per tutti i campi, solo per le cose difficili, email e url (questo è nel form del guestbook)
    Sì, l'idea è questa.

  30. #30
    Guest

    Predefinito

    Ok, dimmi come fare

    Codice PHP:
    function get_domain($address) {
    if (
    filter_var($address, FILTER_VALIDATE_EMAIL) === false) {
    return
    "";
    }
    return
    array_pop(explode('@', $address));
    }

    function
    in_blacklist($domain) {
    global
    $blacklist;
    return
    in_array($domain, $blacklist);
    }
    $domain = get_domain($suoemail);
    if (empty(
    $suoemail)) {
    $errore .= "&bull;&nbsp;&nbsp;Inserire l'email<br><br>";
    }
    else {
    if (
    filter_var($suoemail, FILTER_VALIDATE_EMAIL) === false) {
    $errore .= "&bull;&nbsp;&nbsp;Inserire un'email valida<br><br>";
    }
    elseif (empty(
    $domain) || in_blacklist($domain)) {
    $errore .= "&bull;&nbsp;&nbsp;Questa email non &egrave; accettata<br><br>";
    }
    }

Pagina 1 di 6 123 ... UltimoUltimo

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •