做什么是更好的方式

时间:2010-04-21 12:06:08

标签: php performance

if(get_magic_quotes_gpc())
{
  $location_name = trim(mysql_real_escape_string(trim(stripslashes($_GET['location_name']))));
}
else
{
  $location_name = trim(mysql_real_escape_string(trim($_GET['location_name'])));
}

这是我到目前为止的代码。在我看来这个代码基本上是......好的。你认为我可以安全地删除内部trim()。请尝试不要用无尽的版本垃圾邮件,我想尝试学习如何做得更好。

更新

因此,在阅读了一些回复后,我想我已经开始了解一种安全地从用户那里获取数据,存储然后再显示它的好方法。

首次加载页面时

$foo = trim($_GET['foo']);
if(get_magic_quotes_gpc())
{
  $foo = stripslashes($foo);
}

然后,当您将此变量用作SQL字符串的一部分时,即使不将数据存储在数据库中,也应该将其转义。

 mysql_real_escape_string($foo);

最后,如果从数据库中读取数据并希望将其显示为HTML(博客或论坛上的此类帖子),则应使用htmlspecialchars

传递变量
echo(htmlspecialchars($bar));

是否有人愿意建议使用更好的功能集?然后显然包装这些函数,使它们更容易调用。

2 个答案:

答案 0 :(得分:1)

下面:

$location_name = trim($_GET['location_name']);
if(get_magic_quotes_gpc()) $location_name=stripslashes($location_name);

然后还有SQL注入保护,但是直到最后一刻才将此var保留在SQL查询中之前不要这样做。即使这样,也不要将更改应用于var本身,而是应用副本。您可能希望之后向用户显示$ location_name(例如,如果表单失败)。所以

$sql="UPDATE whatever(location) VALUES('" . mysql_real_escape_string($location_name) . "')"

我当然假设$ location_name最终会出现在数据库中;否则你不需要mysql_real_escape_string。

最后你要使用htmlspecialchars,如果你要在你的页面上显示$ location_name。

编辑:您希望在显示数据之前使用htmlspecialchars()(肯定不保存已通过数据库中的htmlspecialchars转换的数据)。通常,您希望在最后一刻使用转义函数,然后在var的副本上使用。这样你知道在脚本期间的任何时候var都是原始的,并且没有从之前发生的转换中携带一些随机转义字符。

您也知道您的逃生功能应该在哪里。 sql escaping在你的sql查询附近/处。 XSS转义(htmlspecialchars)位于您在网页中显示数据的部分附近。

最后,一旦掌握了一些东西,你总是可以通过使用PHP的PDO函数来放弃SQL转义。此外,您可能希望看一下:Do htmlspecialchars and mysql_real_escape_string keep my PHP code safe from injection?

答案 1 :(得分:1)

我很遗憾地说,但问题中的一切都是错误的。

首先,它无论如何都与性能无关。这些功能永远不会成为瓶颈,永远不会导致任何性能问题。

接下来,你选择了错误的地方去除魔法引号。魔术引号是输入数据相关,而不是数据库相关。最好是创建一个独特的函数并将其放在配置文件中,并包含在每个脚本中。您可以使用here

中的一个

所以,代码变成这样:

$location_name = mysql_real_escape_string(trim($_GET['location_name']));

但我强烈建议您不要将数据库转义与其他任何内容混合,因为其他任何东西都是可选的,而数据库转义是严格且无条件的。