2009-10-29 56 views
4

最近,我在一些客户的网站上进行了审计。他们回来的一件事是,我可以更好地清理输入数据,因为人们仍然可能对数据库造成潜在的伤害。我还应该做些什么来消毒用户输入?

下面的函数是我正在使用的(旧开发人员的剩余部分),但是我看不到潜在问题可能在哪里。

传递到数据库的字符串将通过XML显示,然后由Flash应用程序读取。

有谁能告诉我我可能会错过什么吗?谢谢

function secure_string($string) 
{ 
    return (strip_tags(addslashes(mysql_real_escape_string(
         stripslashes($string))))); 
} 
+1

显示你所需要的是字符串,而不是当前的功能。保护取决于你想要防范的事情。 – scragar 2009-10-29 10:01:48

+0

@scragar,MySQL注入。至少他说客户说:“对数据库有潜在危害”。 – Frankie 2009-10-29 10:07:42

+7

我不会做PHP(不再),但是,诚实地说,在一个链中调用'addslashes'和'stripslashes'确实给我的眼睛带来了一滴眼泪。 – shylent 2009-10-29 10:44:30

回答

5

更好地使用新的PHP功能filter_var()进行清洁输入。新的和更好的。

+0

感谢兄弟。过滤器var目前看来是最好的选择。 – Drew 2009-10-29 14:16:29

5

看起来好像有太多的功能正在进行。 mysql_real_escape_string()已经逃脱了你需要逃脱的所有事情,所以没有必要运行addslashes()。事实上,它可以通过逃避mysql_real_escape_string()创建的反斜杠而产生更多的伤害。

+0

只是为了提示,有一个像mysql_real_escape_string()函数,但为postgresql? pg_escape_string或pg_escape_bytea似乎不适用于注入 – Strae 2009-10-29 13:30:40

+0

“pg_escape_string”如何工作?它应该工作得很好。尽管'pg_query_params'是更好的方式来运行查询。 – 2009-10-29 14:45:27

1

取决于使用“安全”字符串的位置。如果它将用于数据库中,则只需要mysql_real_escape_string(),仅此而已。如果它将以html格式显示,则只需要htmlentities(),仅此而已。简而言之:你的代码太多了,甚至可能是有害的。

如果您希望将其存储在数据库中,以便稍后在html中显示它(例如评论),则在存储字符串时应使用mysql_real_escape_string(),而在显示时应使用htmlentities()

2

mysql_real_escape_string是最后一步,您不应该将它用于您的应用程序逻辑。唯一的目的是将字符串传递给数据库,所以只有在构建查询时才使用它。您可以将任何内容传递给mysql_real_escape_string,并确保您可以安全地将其存储在数据库中。

其余的,这取决于你想要什么。如果您想剥离标签,请使用strip_tags等。

+0

该字符串被输出到一个xml文件,该文件又被Flash应用程序读取。谢谢 – Drew 2009-10-29 10:10:07

+0

如果将它添加到XML文件中,则在将它添加到XML文件时,应将其转义为XML *。在这里,您正在处理将字符串添加到数据库,因此您将其转义为数据库。您需要为不同的目的使用不同的验证/转义函数。 – 2009-10-29 10:13:41

+0

谢谢你!当我解压时,我不会担心理智! :) – Drew 2009-10-29 14:14:42

1

如果您的服务器使用php 5.2或更高版本,则应该使用filter_var作为XML部分。

$output = filter_var($input, FILTER_SANITIZE_STRING); 

要将某些内容存储到数据库中,请使用PDO和参数化查询。