0

MYSQL插入某些类型的文本问题

例如,当我尝试插入此内容时:

INSERT INTO `Attacks_key` 
  (`Event_Key` ,`Variable` ,`Value` ,`Impact` ,`Tags`)
    VALUES 
  ('111', 'REQUEST', ' mysql_real_escape ', '222', 'xss, csrf, id, rfe, lfi');

它插入但是当我尝试插入这个时:

INSERT INTO `Attacks_key` 
 (`Event_Key` ,`Variable` ,`Value` ,`Impact` ,`Tags`) 
   VALUES 
 ('111', 'REQUEST', 'mysql_real_escape_string($_POST['username']); ', '222', 'xss, csrf, id, rfe, lfi');

MYSQL 显示此消息:

#1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取在“用户名”附近使用的正确语法]);', '222', 'xss, csrf, id, rfe, lfi')' 在第 1 行

这是我的 php 代码

$user="root";
$password="*";
$database="*";
mysql_connect(localhost,$user,$password);
@mysql_select_db($database) or die( "Unable to select database");
$sql = "SELECT `Key_id` FROM `Event` ORDER BY `Key_id` DESC LIMIT 1";
$result =mysql_query($sql);
$row = mysql_fetch_assoc($result);
$EventKey= $row['Key_id'];
$query="INSERT INTO `PHPLOGS`.`Attacks_key` (`Event_Key` ,`Variable` ,`Value` ,`Impact` ,`Tags`) VALUES ('$EventKey', '$getname', '$getvalue', '$getimpec', '$gettags');";
mysql_query($query);
mysql_close();

和输入 'mysql_real_escape_string($_POST['username']); 来自用户

有人可以帮忙吗

谢谢

4

3 回答 3

1

尝试

$query = sprintf("INSERT INTO Attacks_key (Event_Key ,Variable ,Value ,Impact ,Tags) VALUES ('111', 'REQUEST', '%s', '222', 'xss, csrf, id, rfe, lfi');", mysql_real_escape_string($_POST['username']));

声明的'那部分与'username'

看看mysql_real_escape_string

于 2012-07-11T11:28:22.097 回答
0

如果您mysql_real_escape_string($_POST['username']);按字面意思插入,请转义单引号。

INSERT INTO `Attacks_key` 
 (`Event_Key` ,`Variable` ,`Value` ,`Impact` ,`Tags`) 
   VALUES 
 ('111', 'REQUEST', 'mysql_real_escape_string($_POST[\'username\']); ', '222', 'xss, csrf, id, rfe, lfi');
于 2012-07-11T11:30:56.260 回答
0

因为你真的应该切换到 PDO 而不是弃用的 mysql_ 函数,你可以使用PDO::quote

PDO::quote() 在输入字符串周围放置引号(如果需要)并转义输入字符串中的特殊字符,使用适合底层驱动程序的引用样式。

但是,进行查询的首选方法是使用准备好的查询,在这种情况下,无论如何您都不会遇到引号转义问题。再次引用 PDO 的 php 手册页:;quote

如果您使用此函数构建 SQL 语句,强烈建议您使用 PDO::prepare() 来准备带有绑定参数的 SQL 语句,而不是使用 PDO::quote() 将用户输入插入到 SQL 语句中。带有绑定参数的预处理语句不仅更便携、更方便、不受 SQL 注入的影响,而且执行起来通常比插值查询快得多,因为服务器端和客户端都可以缓存查询的编译形式。

如果出于某种原因不能选择 PDO,则可以使用具有类似功能的mysqli_real_escape_string 。

于 2012-07-11T11:37:11.633 回答