5

所以在我正在编写的这个程序中,我实际上使用表单从用户那里获取了一个 SQL 查询。然后我继续在我的数据库上运行该查询。

我知道不要“信任”用户输入,所以我想对输入进行清理。我正在尝试使用mysql_real_escape_string,但未能使其正常工作。

这是我正在尝试的,给定输入: select * from Actor;

//"query" is the input string: 
$clean_string = mysql_real_escape_string($query, $db_connection); 
$rs = mysql_query($clean_string, $db_connection); 
if (!$rs) 
{ 
    echo "Invalid input!"; 
} 

这总是给我

“输入无效!”

错误。

当我取出clean_string零件并mysql_query在查询中运行时,

“输入无效”

消息不输出。相反,当我这样做时:

$rs = mysql_query($query, $db_connection); 
if (!$rs) 
{ 
   echo "Invalid input!"; 
} 

它不输出

“输入无效”。

但是,我需要使用该mysql_real_escape_string功能。我究竟做错了什么?

更新:

作为 select * from Actor;输入,我发现了以下内容。

使用 echo 语句,我发现在清理之前,字符串包含值: select * from Actor; 这是正确的。但是,在清理后,它的值不正确select *\r\nfrom Actor;,因此出现错误消息。为什么 mysql_real_escape_string要这样做?

4

6 回答 6

13

在查询中的实际值上使用它,而不是整个查询字符串本身。

例子:

$username = mysql_real_escape_string($_POST['username']);
$query = "update table set username='$username' ...";
$rs = mysql_query($query);
于 2011-04-17T04:32:34.167 回答
1

不要使用过时的 mysql 扩展,而是切换到PDO准备好的语句参数不易被注入,因为它们将值与语句分开。准备好的语句和 PDO 具有其他优势,包括性能、易用性和附加功能。如果您需要教程,请尝试“使用 PHP 和 PDO 编写 MySQL 脚本”。

于 2011-04-17T04:37:35.620 回答
1

mysql_real_escape_string()字符串转义函数。它不会使任何输入安全,只是字符串,不适用于 LIKE 子句,并且整数仍然需要以不同方式处理。

一个更简单、更通用的例子可能是:

 $post = array_map("mysql_real_escape_string", $_POST);
 // cleans all input variables at once

 mysql_query("SELECT * FROM tbl WHERE id='$post[id]' 
                OR name='$post[name]' OR mtime<'$post[mtime]' ");
 // uses escaped $post rather than the raw $_POST variables

'请注意,对于 SQL 字符串,每个变量仍然必须用单引号括起来。(否则转义将毫无意义。)

于 2011-04-17T04:39:54.593 回答
0

您应该使用mysql_real_escape_string将参数转义到查询,而不是整个查询本身。

例如,假设您有两个从表单收到的变量。然后,您的代码将如下所示:

$Query = sprintf(
    'INSERT INTO SomeTable VALUES("%s", "%s")', 
    mysql_real_escape_string($_POST['a'], $DBConnection),
    mysql_real_escape_string($_POST['b'], $DBConnection)
);

$Result = mysql_query($Query, $DBConnection);
于 2011-04-17T04:34:19.400 回答
0

手动mysql_real_escape_string()

转义字符串中的特殊字符以在 SQL 语句中使用

所以你不能转义整个查询,只能转义数据......因为它会转义所有不安全的字符,如引号(查询的有效部分)。

如果你尝试这样的事情(逃避整个查询)

echo mysql_real_escape_string("INSERT INTO some_table VALUES ('xyz', 'abc', '123');");

输出是

INSERT INTO some_table VALUES (\'xyz\', \'abc\', \'123\');

这不再是有效的查询

于 2011-04-17T04:34:43.340 回答
0

这对我有用。dwolf (wtec.co)

<?php
// add data to db
require_once('../admin/connect.php');

$mysqli = new mysqli($servername, $username, $password, $dbname);

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

$post = $mysqli->real_escape_string($_POST['name']);
$title = $mysqli->real_escape_string($_POST['message']);


/* this query with escaped $post,$title will work */
if ($mysqli->query("INSERT into press (title, post) VALUES ('$post', '$title')")) {
    printf("%d Row inserted.\n", $mysqli->affected_rows);
}

$mysqli->close();


//header("location:../admin"); 
?>
于 2015-07-18T19:14:13.140 回答