0

这是原始代码:

       if (($handle = fopen($source_file, "r")) !== FALSE) {
    $columns = fgetcsv($handle, $max_line_length, ",");
    foreach ($columns as &$column) {
        $column = str_replace(".","",$column);
    }
    while (($data = fgetcsv($handle, $max_line_length, ",")) !== FALSE) {
        while(count($data) < count($columns)) {
            array_push($data, NULL);
        }
        $c = count($data);
        for($i = 0; $i < $c; $i++) {
            $data[$i] = "'{$data[$i]}'";
        }

        $sql[] = '(' . implode(',', $data) . ", '" . $_POST['custgroup'] . "'," . $_POST['user_id'] . ')';
    }


$query = "INSERT INTO $target_table (" . implode(',', $columns) . 
      ',custgroup,user_id) VALUES ' . implode(',', $sql);


    //mysql_query($query) or trigger_error(mysql_error());
    echo $query;
    fclose($handle);
}

但是一旦我添加了 mysql_real_escape_string:

   $query = "INSERT INTO $target_table (" . implode(',',array_map('mysql_real_escape_string', $columns)) . 
          ',custgroup,user_id) VALUES ' . implode(',',array_map('mysql_real_escape_string', $sql));

查询将变为:

INSERT INTO UserAddedRecord (lastname,firstname,ceLL,fax,email,code,custgroup,user_id) VALUES (\'Last\',\'First\',\'01122331\',\'\',\'abc@hotmail.com\',\'12345\', \'\',17)

我检查了我的 php.ini 和 get_magic_quotes_gpc(),魔术报价被禁用。

magic_quotes_gpc = 关闭

magic_quotes_runtime = 关闭

magic_quotes_sybase = 关闭

应该是什么问题?或者我应该只应用stripslashes()?但我认为它只会在启用魔术引号时使用。

4

1 回答 1

3

您应该遵循以下原则:

  • 用于mysql_real_escape_string所有字符串值
  • 将所有中间人转换为 (int)
  • 之后应用周围的单引号( ' )

mysql_real_escape_string 的重点是转义测试内容中的特殊字符,因此使用stripslashes 会消除它。

解决这个问题的另一种方法是查看preparedStatements您不需要客户端逃逸的地方。

请记住,这样做的全部目的是防止SQL 注入并采取相应的行动:)

于 2011-11-09T09:23:07.337 回答