2010-04-21 123 views
2
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()。请尽量不要使用无尽版本的垃圾邮件本,我想尝试了解如何更好地做到这一点。什么是更好的做法以下

UPDATE

所以,阅读一些的答复后,我觉得我已经认识到了安全地从用户获取数据,保存它,然后将其重新显示了良好的方法。

,当你来到使用这个变量作为SQL字符串的一部分。当你第一次加载页面

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

这样,即使没有存储在数据库中的数据,你应该逃避它。

mysql_real_escape_string($foo); 

最后,如果从数据库中读取数据,并希望将其显示为HTML,博客或论坛这样一个帖子,你应该通过使用htmlspecialchars

echo(htmlspecialchars($bar)); 

将任何一个变量喜欢建议使用更好的一组函数?其他显然包装这些功能,使他们更容易打电话。

+2

我想你可以安全地删除**外**'trim()'。我不认为'mysql_real_escape_string'会附加任何不必要的空格。 – 2010-04-21 12:08:37

+0

稍作修改。而不是“当你将* this *变量用作SQL字符串的一部分”时,而是任何变量。 **和**只有当你打算用引号括起来。但是,当然,所有这些规则一旦转向准备好的陈述就会过时,就像马诺斯所说的那样。其余的都很完美。 – 2010-04-21 14:42:46

回答

1

这里:

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

然后也有SQL注入的保护,但在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转义是靠近你的SQL查询。 XSS转义(htmlspecialchars)接近您在网页中显示数据的部分。

最后,一旦你掌握了某些东西,你总是可以放弃使用PHP的PDO函数进行SQL转义。同样在未来,你可能想看看这个:Do htmlspecialchars and mysql_real_escape_string keep my PHP code safe from injection?

+0

这只是使用转义字符串的直接响应的一个好处。 'htmlspecialchars()'你是否在数据存储或显示时使用它? – thecoshman 2010-04-21 12:27:48

+0

这两点都非常好。 @thecoshman,因为它正在显示。或者你会在第二次编辑后破坏数据。 – 2010-04-21 12:55:55

1

我很抱歉地说,但你的问题中的一切都是错误的。

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

接下来,您选择了错误的地方摆脱魔术引号。魔术引号是与输入数据相关的,而不是数据库相关的。最好将独立的功能放在配置文件中,并包含在每个脚本中。您可以使用一个从here

因此,成为这样的代码:

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

但我强烈建议你不要混用数据库与别的逃避,因为任何东西是可选的,而数据库逃逸严格,无条件的。

+0

Col. Shrapnel(我喜欢那个名字)是对的。 – AlexV 2010-04-21 12:50:36