在下面这个基于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;
}
答案 0 :(得分:1)
PDO
和MySQLi
具有内置函数,可用于创建准备好的查询,使您可以毫无问题地使用引号和撇号。
但代表您的问题:将addslashes()
替换为mysql_real_escape_string()
。
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字符串文字中使用的原因。它根本就不是那个意思。