如何在PHP中使用mysql\u real\u escape\u字符串函数

如何在PHP中使用mysql\u real\u escape\u字符串函数,php,mysql,mysql-real-escape-string,Php,Mysql,Mysql Real Escape String,在我编写的这个程序中,我实际上使用表单从用户那里获取了一个SQL查询。然后,我继续在我的数据库上运行该查询 我知道不要“信任”用户输入,所以我想对输入进行消毒。我试图使用mysql\u real\u escape\u string,但没有成功 以下是我正在尝试的,考虑到输入: 从Actor中选择* //"query" is the input string: $clean_string = mysql_real_escape_string($query, $db_connection); $

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

我知道不要“信任”用户输入,所以我想对输入进行消毒。我试图使用
mysql\u real\u escape\u string
,但没有成功

以下是我正在尝试的,考虑到输入:
从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_字符串
部分并在查询中运行
mysql_查询

“无效 输入“

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

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

“无效输入”

但是,我需要使用
mysql\u real\u escape\u string
函数。我做错了什么

更新:

给定
从Actor中选择*作为输入,我发现了以下内容

使用echo语句,我已经 发现在清理之前,字符串包含以下值:
从Actor中选择*
这是正确的。然而,在消毒后,它持有不正确的
select*\r\n从Actor中选择的值,因此出现错误消息。为什么

mysql\u real\u escape\u string
这样做

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

例如:

$username = mysql_real_escape_string($_POST['username']);
$query = "update table set username='$username' ...";
$rs = mysql_query($query);

您应该使用
mysql\u real\u escape\u 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);
手册

转义字符串中的特殊字符 用于SQL语句中

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

如果您尝试类似的操作(以逃避整个查询)

输出为

插入某些表值(\'xyz\', \“abc\”、“123\”)


如果不再是有效的查询,请切换到。参数不易被注入,因为它们将值与语句分开。预处理语句和PDO还有其他优点,包括性能、易用性和附加功能。如果需要教程,请尝试“

是字符串转义函数。它不保证任何输入的安全性,只保证字符串值,不用于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
$post=array\u map(“mysql\u real\u escape\u string”,$\u post);
//一次清除所有输入变量
mysql_查询(“从tbl中选择*,其中id='$post[id]'
或者name='$post[name]'或者mtime这对我来说很有效。dwolf(wtec.co)


我不理解输入部分…您是从用户输入中获取整个查询还是只是一些数据以供以后生成查询?我希望,这不是第一种情况,或者您的安全性有严重问题。请尝试以下教程:echo“Invalid input”;to this:die('Invalid input:'。mysql_error())您可能会考虑使用MySQL接口,使用参数化查询并避免整个问题。MySQL推荐。WH1T3H4CK5:我可能应该指出,这只是我正在进行的一个小项目。这是真的,我抓住了整个查询的输入。y、 我不是要你们做我的家庭作业。这个错误显然是我实际项目的一小部分。
 $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
<?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"); 
?>