Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Μαθαινω ασφαλεια αυτον τον καιρο και για πειραματικους σκοπους μαθησης στο 000webhost δοκιμασα να ασφαλησω μια ηδη υπαρχουσα φορμα που ειχα με ajax η οποια στελνει ενα mail απο φορμα.
Ηδη εβαλα καποιους ελενχους και νομιζω δουλεουν σωστα.
 

header injection
preg_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    
?>
Δημοσ.

Αφού εν τέλει κάνεις submit τη φόρμα με ajax και συγκεκριμένη function, μήπως πρέπει να προσθέσεις κι αυτό;

formdata.append( "key", _("key").value );

Και να αλλάξεις τη σχετική γραμμή σε (να βάλεις δλδ ένα id="key"):

<input type="hidden" name="key" id="key" value="<?php echo $key; ?>">
  • Like 1
Δημοσ.

 

Αφού εν τέλει κάνεις 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

 

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...