【问题标题】:Load Data Local Infile with password_hash使用 password_hash 加载数据本地 Infile
【发布时间】:2015-04-08 21:00:24
【问题描述】:

我正在尝试将 CSV 上传到表格。但是,密码是纯文本的,我想在此过程中将其转换为 password_hash。请帮忙。

$sql = "LOAD DATA LOCAL INFILE '".$mylfile."'
   INTO TABLE parentstudent
   FIELDS TERMINATED BY ','
   OPTIONALLY ENCLOSED BY '\"' 
   LINES TERMINATED BY '\n' 
   IGNORE 1 LINES 
   (parentstudent_id, @parent_id, student_id, school_id)
   set parent_id =".password_hash."'(parent_id,".PASSWORD_DEFAULT.")";

$con=mysqli_connect("localhost","root","","confapp");

$result = mysqli_query($con, $sql);

【问题讨论】:

  • 一种选择是在 CSV 文件中读取密码的哈希值,使用哈希密码写入第二个 CSV 文件,然后执行LOAD DATA ... 的操作。
  • 你能给我举个例子吗...我是php新手
  • 好的,可以给我一行CSV文件作为例子吗?当然用虚拟数据替换任何敏感值。
  • id(autoincremtent) parent_id(password_hash Student_id School_id NULL 44444444 425450 0236 NULL 11111111 425450 0237 NULL 22222222 425450 0238
  • parent_id 是需要散列的东西吗?

标签: php mysql password-hash


【解决方案1】:

假设有一个名为clearpwords.csv 的文件,其内容如下:

1,test,1,1
2,testtest,2,1

以下程序将对第二列进行哈希处理。

<?php
// this is needed for any significant number of inputs to password_hash()
set_time_limit(0);

$infile = "clearpwords.csv";
$myfile = "hashedpwords.csv";

$reader = fopen($infile, 'r');
$writer = fopen($myfile, 'w');
$buffer = '';

while ($line = fgetcsv($reader)) {
    $line[1] = password_hash($line[1], PASSWORD_DEFAULT);

    $buffer .= implode(',', $line) . "\n";

    if (strlen($buffer) > 1024) {
        fwrite($writer, $buffer);
        $buffer = '';
    }
}

fwrite($writer, $buffer);
fclose($reader);
fclose($writer);

它将创建一个名为 myfile.csv 的文件,如下所示。

1,$2y$10$KwG1S4w7T4ov71bFSsKhlOW2CpFrMurtZRz3az94o7BX70pmohCb.,1,1
2,$2y$10$zQkH5vDIYLCqkUxxaqH6nuZ67fXj71XiBVjxztvst.dtvSlFqjDou,2,1

您现在可以在 myfile.csv 上运行您的脚本

$sql = "LOAD DATA LOCAL INFILE '".$mylfile."'
        INTO TABLE parentstudent
        FIELDS TERMINATED BY ','
        OPTIONALLY ENCLOSED BY '\"' 
        LINES TERMINATED BY '\n' 
        IGNORE 1 LINES 
        (parentstudent_id, @parent_id, student_id, school_id)";

$con = mysqli_connect("localhost", "root", "", "confapp");
$result = mysqli_query($con, $sql);

请注意,password_hash 仅在 PHP 5.5 及更高版本中可用。如果您运行的是之前的版本并且无法升级,请改用crypt 函数。

不要试图使用SHA-*MD-*

【讨论】:

  • 在没有最重要的部分“$data[1] = password_hash($data[1], PASSWORD_DEFAULT);”的情况下完美运行使用 password_hash 函数,它在“LOAD DATA LOCAL INFILE”之前超时我能做些什么来纠正这个问题?谢谢!
  • 日志文件说什么? CSV 文件有多大?
  • 文件大小为 115kb 该文件有 3268 行,但仅将 1600 行写入 hashedpwors.csv 并停止。没有错误消息,只是超时。如果我删除password_hash,它就起作用了。我的猜测是 password_hash 正在减慢进程,因此超过了 wait_timeout...
  • 这也是我的想法。这个散列函数被故意设计得很慢,使它成为密码散列的合适选择。尝试将 max_execution time 更改为 0。
  • 这只是你必须为强大的加密哈希函数付出的代价。
猜你喜欢
  • 1970-01-01
  • 2011-05-25
  • 1970-01-01
  • 2023-03-09
  • 1970-01-01
  • 2016-07-29
  • 2012-10-26
  • 2015-12-20
  • 1970-01-01
相关资源
最近更新 更多