所以在我编写的这个程序中,我实际上是使用表单从用户那里获取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
这样做?
答案 0 :(得分:13)
在查询中的实际值上使用它,而不是整个查询字符串本身。
示例:
$username = mysql_real_escape_string($_POST['username']);
$query = "update table set username='$username' ...";
$rs = mysql_query($query);
答案 1 :(得分:1)
切换到PDO,而不是使用过时的mysql扩展名。 Prepared statement参数不容易被注入,因为它们将值与语句分开。准备好的声明和PDO还有其他优点,包括性能,易用性和附加功能。如果您需要教程,请尝试“Writing MySQL Scripts with PHP and PDO”。
答案 2 :(得分: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字符串的单引号括起来。 (否则逃避将毫无意义。)
答案 3 :(得分: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);
答案 4 :(得分:0)
转义字符串中的特殊字符 用于SQL语句
所以你无法逃避整个查询,只是数据...因为它会转义所有不安全的字符,如引号(查询的有效部分)。
如果您尝试这样的事情(以逃避整个查询)
echo mysql_real_escape_string("INSERT INTO some_table VALUES ('xyz', 'abc', '123');");
输出
插入some_table VALUES(\'xyz \', \'abc \',\'123 \');
和无效查询。
答案 5 :(得分: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");
?>