如何在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
相关产品推荐
相关产品推荐

