簡體   English   中英

加密后檢查空白字段

[英]Check for empty field after encryption

我有這段html代碼:

<form action="register.php" method="post">
       Email: <input type="text" name="email" /><br />
       Username: <input type="text" name="username" /><br />
       Password: <input type="password" name="p" id="password" /><br />
       <input type="button" value="Register" onclick="formhash(this.form, this.form.password);" />
</form>

按下注冊按鈕后,將調用加密,密碼將立即加密。 我以為這樣做是一種非常安全的方法,但是我似乎無法檢查名為“ p”的passworld字段是否為空,因為如果用戶在注冊時將該字段保留為空,則加密會加密空字段,因此它不再為空。 我需要一種方法來檢查用戶是否將“ p”字段留空,因為使用0個字符的密碼是不可能的。

我知道可以用javascript解決此問題,但是我需要一種安全的方法來檢查該字段是否為空,因此我想獲得一個PHP解決方案。

register.php:

<script type="text/javascript" src="sha512.js"></script>
<script type="text/javascript" src="forms.js"></script>

<?php
include 'db_connect.php';

//Just to check that the p field is encrypted already at this point. 
echo $_POST['p'];

// The username
$username = $_POST['username'];
// The email
$email = $_POST['email'];
// The hashed password from the form
$password = $_POST['p']; 
// Create a random salt
$random_salt = hash('sha512', uniqid(mt_rand(1, mt_getrandmax()), true));
// Create salted password (Careful not to over season)
$password = hash('sha512', $password.$random_salt);

// Add your insert to database script here. 
// Make sure you use prepared statements!
if ($insert_stmt = $mysqli->prepare("INSERT INTO members (username, email, password, salt) VALUES (?, ?, ?, ?)")) {    
   $insert_stmt->bind_param('ssss', $username, $email, $password, $random_salt); 
   // Execute the prepared query.
   $insert_stmt->execute();
}
?>

如果有人監控您的流量,他們仍然可以獲取該密碼。 它只是從原始字符串更改為哈希值。 這不是安全功能!

如果您擔心有人攔截數據,請使用https。

刪除您的客戶端哈希:

<form action="register.php" method="post">
       Email: <input type="text" name="email" /><br />
       Username: <input type="text" name="username" /><br />
       Password: <input type="password" name="p" id="password" /><br />
       <input type="submit" name="submit" value="Register" />
</form>

注意:password_hash是PHP 5.5中的新增功能,如果您的版本較舊,請嘗試使用此userland實現

將您的PHP代碼更改為此:

<?php
include 'db_connect.php';

if (!isset($_POST['p']) || (10 > strlen($_POST['p']))) {
    //password too short!
}

if (!isset($_POST['username']) || (3 > strlen($_POST['username']))) {
    //username too short!
}

// The username
$username = $_POST['username'];
// The email
$email = $_POST['email']
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    //not a valid email (mostly)
}
// The unaltered password from the form
$password = $_POST['p']; 

// Create salted password (Careful not to over season)
$password = password_hash($password, PASSWORD_BCRYPT);

// Add your insert to database script here. 
// Make sure you use prepared statements!
if ($insert_stmt = $mysqli->prepare("INSERT INTO members (username, email, password) VALUES (?, ?, ?)")) {    
   $insert_stmt->bind_param('sss', $username, $email, $password); 
   // Execute the prepared query.
   $insert_stmt->execute();
}

使用此命令來驗證登錄/驗證密碼:

password_verify($password, $passwordFromDb)

具有一個javascript函數,可在單擊注冊按鈕時驗證表單:

使用它來檢查密碼字段是否有任何輸入:

if (document.getElementById('Password').value.length!=0) {
   //encrypt and submit form
} else {
   //return to form and display error to user
} 

旁注,請始終使用SSL提交密碼,迫使用戶在發送密碼之前先對其密碼進行哈希處理,然后再次對其進行哈希處理可能會過多,並且不會阻止任何人在攻擊中重用密碼或哈希。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM