You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PHP上传CSV至MySQL时将明文密码转为password_hash存储

代码修改方案

前置准备

首先请确认你的voters表中password字段的长度不小于varchar(255):PHP内置的password_hash函数使用默认PASSWORD_DEFAULT算法生成的哈希串长度会随算法迭代更新,预留足够长度可以避免哈希被截断导致后续密码校验失败。

核心修改点

你只需要调整CSV读取循环中密码字段的处理逻辑,将明文密码先做哈希处理再存入数据库即可,修改后的完整代码如下:

$connect = mysqli_connect('hostname', 'username', 'password', 'database');
if(isset($_POST["submit"]))
{
 if($_FILES['file']['name'])
 {
  $filename = explode(".", $_FILES['file']['name']);
  if($filename[1] == 'csv')
  {
   $handle = fopen($_FILES['file']['tmp_name'], "r");
   while($data = fgetcsv($handle))
   {
             $item1 = mysqli_real_escape_string($connect, $data[0]);  
             // 新增逻辑:对CSV中读取的明文数字密码做哈希处理
             $hashed_password = password_hash($data[1], PASSWORD_DEFAULT);
             $item2 = mysqli_real_escape_string($connect, $hashed_password);
             $query = "INSERT into voters(voters_id, password) values('$item1','$item2')";
             mysqli_query($connect, $query);
   }
   fclose($handle);
   echo "<script>alert('Import done');</script>";
  }
 }
}
?>  
<!DOCTYPE html>  
<html>  
 <head>  
  <title>Webslesson Tutorial</title>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script>  
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" />
 </head>  
 <body>  
  <form method="post" enctype="multipart/form-data">
   <div align="center">  
    <label>Select CSV File:</label>
    <input type="file" name="file" />
    <br />
    <input type="submit" name="submit" value="Import" class="btn btn-info" />
   </div>
  </form>
 </body>  
</html>

额外优化建议

原代码直接拼接SQL语句存在SQL注入风险,更安全的写法是使用预处理语句,循环部分可替换为如下逻辑:

// 提前创建预处理语句
$stmt = mysqli_prepare($connect, "INSERT into voters(voters_id, password) values(?, ?)");
while($data = fgetcsv($handle))
{
    $hashed_password = password_hash($data[1], PASSWORD_DEFAULT);
    // 绑定参数并执行
    mysqli_stmt_bind_param($stmt, "ss", $data[0], $hashed_password);
    mysqli_stmt_execute($stmt);
}
mysqli_stmt_close($stmt);

这种写法不需要手动做字符串转义处理,也能完全避免SQL注入问题。

内容的提问来源于stack exchange,提问作者Steven5655

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 15:30:00