SQL注入和addSlashes

时间:2014-07-06 11:07:51

标签: php mysql csv sql-injection

在下面这个基于verbatim mysql的代码中,解析了一个CSV文件,并动态创建了一个mySQL表。 我刚刚进入 - > http://www.johnboy.com/blog/tutorial-import-a-csv-file-using-php-and-mysql

如您所见,他们正在使用addslashes。

这段代码节省了我的时间,但在我开始使用它之前(在没有mysqli或PDO的5.3的WordPress环境中),我想挑选你的大脑,如果它安全的话做。

这一切都归结为都有些。我很好奇他们为什么不去my_real_escape_string。

//connect to the database
$connect = mysql_connect("localhost","username","password");
mysql_select_db("mydatabase",$connect); //select the table
//

if ($_FILES[csv][size] > 0) {

    //get the csv file
    $file = $_FILES[csv][tmp_name];
    $handle = fopen($file,"r");

    //loop through the csv file and insert into database
    do {
        if ($data[0]) {
            mysql_query("INSERT INTO contacts (contact_first, contact_last, contact_email) VALUES
                (
                    '".addslashes($data[0])."',
                    '".addslashes($data[1])."',
                    '".addslashes($data[2])."'
                )
            ");
        }
    } while ($data = fgetcsv($handle,1000,",","'"));
    //

    //redirect
    header('Location: import.php?success=1'); die;

}

2 个答案:

答案 0 :(得分:1)

PDOMySQLi具有内置函数,可用于创建准备好的查询,使您可以毫无问题地使用引号和撇号。

代表您的问题:将addslashes()替换为mysql_real_escape_string()
addslashes可以很容易地传递,并且根本不安全。

Read this article for more info about bypassing addslashes.

答案 1 :(得分:0)

addslashes逃避某些字符:

  

这些字符是单引号('),双引号("),反斜杠(\)和NUL(NULL字节)。

这些在MySQL string literals中也很重要,因为它们可以用作分隔符或引入转义序列。这可能是示例中选择addslashes的原因。

但是,addslashes仅对MySQL does also support a variety of character sets/encodings的字节起作用,其中一些是多字节的。 addslashes在多字节字符编码时失败,而mysql_real_escape_string考虑​​当前字符编码:

  

转义 unescaped_string 中的特殊字符,并考虑连接的当前字符集,以便将其放在mysql_query()中是安全的。如果要插入二进制数据,则必须使用此功能。

还有actual cases where addslashes does not sufficiently escapes data due to some multi-byte character encoding。这就是为什么addslashes不应该用于转义字符串以便在MySQL字符串文字中使用的原因。它根本就不是那个意思。