Ruhl Δημοσ. 14 Αυγούστου 2017 Δημοσ. 14 Αυγούστου 2017 Μαθαινω ασφαλεια αυτον τον καιρο και για πειραματικους σκοπους μαθησης στο 000webhost δοκιμασα να ασφαλησω μια ηδη υπαρχουσα φορμα που ειχα με ajax η οποια στελνει ενα mail απο φορμα.Ηδη εβαλα καποιους ελενχους και νομιζω δουλεουν σωστα. header injectionpreg_match("/[\r\n]/", $str)XSS htmlentities()trim()Με CSRF δεν μπορεσα να το κανω να δουλεψει απο tutorial και google.Τι κανω λαθος? η φορμα δουλευει κανονικα χωρις την προσθηκη κωδικα CSRF τον οποιο θα βαλω σε σχολια //CSRF kai <!-- CSRF για να μην ψαχνετεindex.php <!-- CSRF <?php session_start(); if(empty($_SESSION['token'])){ $_SESSION['token'] = bin2hex(random_bytes(32)); } $key =$_SESSION['token']; ?> CSRF --> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Website Contact Form</title> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous"> <script> function _(id){ return document.getElementById(id); } function submitForm(){ _("submit-button").disabled = true; _("status").innerHTML = 'please wait ...'; var formdata = new FormData(); formdata.append( "name", _("name").value ); formdata.append( "email", _("email").value ); formdata.append( "comments", _("comments").value ); var ajax = new XMLHttpRequest(); ajax.open( "POST", "mail.php" ); ajax.onreadystatechange = function() { if(ajax.readyState == 4 && ajax.status == 200) { if(ajax.responseText == "success"){ _("contact-form").innerHTML = '<h2>Ευχαριστώ '+_("name").value+', το μήνυμα σου στάλθηκε</h2>'; } else { _("status").innerHTML = ajax.responseText; _("submit-button").disabled = false; } } } ajax.send( formdata ); } </script> </head> <body> <form id="contact-form" onsubmit="submitForm(); return false;" method="post"> <label style="color:wheat;" for="name">Ονομα *</label> <div class="form-group"> <input id="name" placeholder="Το όνομα σου" type="text" class="form-control" style="width: 30%" required> </div> <label style="color:wheat;" for="email">Email *</label> <div class="input-group"> <span class="input-group-addon"><i class="fa fa-envelope-o fa-fw"></i></span> <input id="email" style="width: 26%" class="form-control" type="email" placeholder="Το Email σου" required> </div> <label style="padding-top: 8px; color:wheat;" for="comments">Σχόλια *</label> <div class="form-group"> <textarea id="comments" placeholder="Γράψε μας ένα μήνυμα με τυχόν ερωτήσεις/απορίες που έχεις και θα σου απαντήσουμε άμεσα!" class="form-control" rows="8" style="resize:none;" required></textarea> </div> <div class="form-group"> <input id="submit-button" name="submit" type="submit" value="Αποστολή" class="btn btn-info btn-block"> <!-- CSRF <input type="hidden" name="key" value="<?php echo $key; ?>"> CSRF --> <span id="status"></span> </div> </form> </body> </html> (Επισης δεν εχω βαλει στο <form action="mail.php" αλλα νομιζω δεν χρειαζεται)mail.php <?php //CSRF code session_start(); //CSRF code function escape_tags($str){ return htmlentities($str, ENT_QUOTES, 'UTF-8'); } function header_injection($str){ return preg_match("/[\r\n]/", $str); } //CSRF code if ($_SERVER['REQUEST_METHOD'] === 'POST'){ if(!empty($_POST['key'])){ if(hash_equals($_SESSION['token'], $_POST['key'])){ unset($_SESSION['token']); //CSRF code if( isset($_POST['name']) && isset($_POST['email']) && isset($_POST['comments']) ){ $name_value = escape_tags(trim($_POST['name'])); $email_value = escape_tags(trim($_POST['email'])); $message_value = escape_tags(nl2br($_POST['comments'])); if(header_injection($name_value) || header_injection($email_value)){ die(); } $to = "[email protected]"; $subject = 'Contact Form Message'; $message = '<b>Name:</b> '.$name_value.' <br><b>Email:</b> '.$email_value.' <hr><p>'.$message_value.'</p>'; $headers = "From: $email_value\n"; $headers .= "MIME-Version: 1.0\n"; $headers .= "Content-type: text/html; charset=iso-8859-1\n"; if( mail($to, $subject, $message, $headers) ){ echo "success"; } else { echo "The server failed to send the message. Please try again later."; } } //CSRF code here } else{ unset($_SESSION['token']); die('CSRF is invalid'); } } else{ die('CSRF token not found'); } } //CSRF code here ?>
philos Δημοσ. 14 Αυγούστου 2017 Δημοσ. 14 Αυγούστου 2017 Αφού εν τέλει κάνεις submit τη φόρμα με ajax και συγκεκριμένη function, μήπως πρέπει να προσθέσεις κι αυτό; formdata.append( "key", _("key").value ); Και να αλλάξεις τη σχετική γραμμή σε (να βάλεις δλδ ένα id="key"): <input type="hidden" name="key" id="key" value="<?php echo $key; ?>"> 1
Ruhl Δημοσ. 15 Αυγούστου 2017 Μέλος Δημοσ. 15 Αυγούστου 2017 Αφού εν τέλει κάνεις submit τη φόρμα με ajax και συγκεκριμένη function, μήπως πρέπει να προσθέσεις κι αυτό; formdata.append( "key", _("key").value ); Και να αλλάξεις τη σχετική γραμμή σε (να βάλεις δλδ ένα id="key"): <input type="hidden" name="key" id="key" value="<?php echo $key; ?>"> Ευχαριστω παρα πολυ για την απαντηση ,δουλεψε κανονικα με αυτες τις προσθηκες , μαλον λογω ajax ηταν που δεν εχω καλη γνωση προς το παρον. Μπορεις να μου πεις αν ο κωδικας ειναι ενταξη ? για τις XSS και CSRF επιθεσεις Δεν ειμαι σιγουρος αν χρειαζεται τα unset($_SESSION['token']); ? και νομιζω δεν εβαλα ενα die(); αν χρειαζεται ? αφου στηλω το e-mail με την mail συναρτηση δηλαδη πανω απο το προτελευταιο //CSRF code here
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα