我知道在查询中运行时我必须使用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']."";
,因为这是来自一个查询,而不是INTO。但是要100%肯定。
(我知道PDO和mysqli)
答案 0 :(得分:2)
我知道在查询中运行它时我必须使用mysql_real_escape_string
相反,你不应该在这样的查询中使用mysql_real_escape_string。
没有任何好处,但会给你带来虚假的安全感。
正如您可以从函数名称中所说,它用于在添加数字时转义字符串。因此,此功能变得无用,而您的查询仍然可以进行注入。
必须使用此函数来格式化SQL查询中的引用字符串 因此,您可以从此规则中得出答案:不,使用此函数进行输出没有意义。
至于保护,要么将你的号码视为一个字符串(通过引用和转义它)或使用intval()函数来强制转换它。
或者,最好的选择,摆脱这种手动格式化并开始使用占位符来表示查询中的动态数据。它不一定是预备语句 - 它可以使用相同的转义,但封装在一些占位符处理函数