0

我知道在查询中运行 mysql_real_escape_string 时必须使用它,例如:

$ProjectHasReservationQuery = ("
                        SELECT * 
                        FROM reservelist rl
                            INNER JOIN project p on rl.projectid = p.projectid
                        WHERE rl.projectid = ". mysql_real_escape_string($record['projectid']) ."
                        AND restype = 'res'
                        ");

但是如何呼应它,例如:

query1 = mysql_query("SELECT * FROM users");
while ($record = mysql_fetch_array($query1 ))
{
    echo "".stripslashes(mysql_real_escape_string($record['usersurname']))."";
    // OR
    echo "".$record['usersurname']."";
}

哪一个?我个人认为echo "".$record['usersurname']."";,因为这是来自查询而不是进入。但要100%确定。

(我知道 PDO 和 mysqli)

4

1 回答 1

2

我知道在查询中运行它时我必须使用 mysql_real_escape_string

恰恰相反,你不应该在这样的查询中使用 mysql_real_escape_string。
这不会有什么好处,只会给你留下虚假的安全感。

从函数名可以看出,它用于在添加数字时转义字符串。因此,此功能变得无用,而您的查询仍然对注入敞开大门。

只需使用此函数来格式化 SQL 查询中的引用字符串。
因此,您可以从这条规则得出答案:不,使用此功能进行输出没有意义。

至于保护,要么将您的号码视为字符串(通过引用和转义它),要么使用 intval() 函数对其进行转换。

或者,最好的选择是摆脱这种手动格式化并开始使用占位符来表示查询中的动态数据。它不一定是准备好的语句 - 它可以使用相同的转义,但封装在一些占位符处理函数中

于 2012-12-12T21:57:39.663 回答