魔术引用和mysql_real_escape_string

时间:2011-11-09 09:18:08

标签: php slash

以下是原始代码:

       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()?但我认为只有在启用魔术引用时才会使用它。

1 个答案:

答案 0 :(得分:3)

你应该采取以下措施:

  • 对所有字符串值使用mysql_real_escape_string
  • 将所有转发器转换为(int)
  • 之后应用周围的单引号(')

mysql_real_escape_string的目的是逃避测试内容中的特殊字符,因此使用stripslashes会将其删除。

解决这个问题的另一种方法是调查preparedStatements,而不需要客户端进行esacping。

请记住,执行此操作的重点是阻止SQL-Injection并采取相应措施:)