0

我要做的是将用户插入带有随机密码的表中(直到这里都可以正常工作),并在成功提交表单后,我想向注册用户发送他们的密码。这是我到目前为止所得到的:

<?php
if (isset($_POST['insert'])) {
require_once 'login.php'; 

  $OK = false;
  $conn = new mysqli ($host, $user, $password, $database) or die("Connection Failed");
  $stmt = $conn->stmt_init();


  $sql = 'INSERT INTO users (user_email, user_name, user_pref, user_password)
          VALUES(?, ?, ?, des_encrypt(substring(md5(rand()),1,8)))';
  if ($stmt->prepare($sql)) {
    // bind parameters and execute statement
    $stmt->bind_param('ssss', $_POST['user_email'], $_POST['user_name'], $_POST['user_pref'], $_POST['user_password']);
    // execute and get number of affected rows
    $stmt->execute();
    if ($stmt->affected_rows > 0) {
      $OK = true;
    }
  }
  if ($OK) {
    header('Location: confirm.php');
    exit;
  } else {
    $error = $stmt->error;
  }
}
?>
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Add User</title>
</head>

<body>
<h1>Add User</h1>
<?php if (isset($error)) {
  echo "<p>Error: $error</p>";
} ?>
<form id="form1" method="post" action="">
  <p>
    <label for="user_email">User email:</label>
    <input name="user_email" type="text" class="widebox" id="user_email">
  </p>
    <p>
    <label for="user_name">User name:</label>
    <input name="user_name" type="text" class="widebox" id="user_name">
  </p>
    <p>
    User role: <select name = "user_pref">
    <option value = "BLU">Blue</option>
    <option value = "YEL">Yellow<option>
    <option value = "GRE">GREEN</option>
    </select>
</p>
  <p>
    <input type="submit" name="insert" value="Register New User" id="insert">
  </p>
</form>
</body>
</html>

选择解密密码和用户电子邮件的 sql 语句将是:

$sql = 'select user_email, des_decrypt(user_password) from users where person_id = max(person_id)';
$result = $mysqli->query($sql)

它会进入这个函数:

if ($OK) {
}

但是我无法让它与基本的邮件功能一起使用。有没有人有任何可以帮助我的想法?

谢谢

4

1 回答 1

0

这里有两个不同的主题需要回答:

  1. 更典型的密码处理是:

    1. 让用户在注册表单中输入密码(使用“重新输入”字段,检查两个字段是否包含相同的字符串,也许使用 javascript 片段来强制一定的密码复杂性 - 网上应该有很多可用的)
    2. 将密码的哈希值存储在数据库中,使用难以反转的 crypt 函数(SQL 中的 bcrypt 或PHP中的crypt )
    3. 为了更安全,使用 time() 或 rand() 创建一个伪随机盐,将其连接到用户的密码,在加密函数中使用连接的字符串。不要忘记将盐也存储在数据库中
    4. 提供“我忘记密码”功能,使用经典的双重认证:用户要求输入密码,您向该用户注册的电子邮件地址发送一封包含一次性令牌的电子邮件,用户必须输入令牌(或单击将令牌设置为 GET 参数的链接),现在只能更改他的密码。
  2. PHP(和其他脚本语言)的邮件可能是一件棘手的事情。PHP 本身没有内置邮件客户端,但需要使用独立的电子邮件组件。您或您的管理员需要确保

    • 服务器提供电子邮件功能(例如 linux 系统中的 sendmail 包)
    • 服务器被允许向世界发送邮件。意思是,防火墙/路由器/代理必须允许邮件端口上的流量

有关使用 php 发送邮件的更多信息,请参阅手册: 邮件

于 2013-01-30T14:51:35.077 回答