2010-01-12 65 views
8

的URL将被什么是“足够消毒”的URL

  1. 保存到MySQL数据库
  2. 用于显示用户的个人资料图片

将用strip_tags()和mysql_real_escape_string()就够了吗?

+1

我收到了类似问题的一些很好的答案;如果您愿意,请查看http://stackoverflow.com/questions/549987/what-is-the-best-way-to-filter-urls-for-input。正如Mike Boers的回答所建议的,最好的解决方案可能是彻底重建URL。 – JAL 2010-01-12 02:33:54

回答

16

“足够的消毒”完全取决于你在说什么环境。 MySQL的消毒应该被认为是完全独立的免于网络输出的消毒,您应该单独处理它们以避免很多麻烦。

消毒的MySQL

  • mysql_real_escape_string()将消毒一块数据并使其安全地把一个SQL查询中。
  • 任何其他类型的恶意数据(如字符串内的HTML标签)都应该被完全忽略。试图在这里操纵它会导致你头痛,因为你试图在将它从数据库中取出后“解除”它。错误的“网络数据”不能损害您的数据库。

消毒输出

  • htmlspecialchars($val)在输出时将防止渲染任何恶意代码,因为<>字符转换为它们的实体表示而不是呈现为标签分隔符。
  • 如果你输出的东西是一个HTML元素的引用属性中,如<input name="email" value="<?php echo htmlspecialchars($email,ENT_QUOTES); ?>" />

这应该是你所需要的,除非你有特殊要求使用ENT_QUOTES修改。 strip_tags()不应该真的用于消毒,因为它可能被形成不良的HTML愚弄。消毒是一个有价值的目标,如果你可以保持你的上下文分离,你将遇到更少的数据操作问题。

+1

+1在需要时进行消毒。当然,对SQL进行消毒是*邪恶的*,只是使用参数化查询... – sleske 2010-01-12 03:04:08

+0

@sleske - 是的,这是目前流行的观点。对SQL进行消毒不是坏事。许多系统将使用较旧的数据库版本或驱动程序,并且可能无法访问MySQLi。消毒得到糟糕代表的唯一原因是因为人们*忘记了这样做*。准备好的查询只是抽象出手动清理(除其他优点外)。 – zombat 2010-01-12 03:18:37

+0

你是什么意思“参数化查询”? – aslum 2010-01-12 03:20:32

1

在字符串上调用htmlentities()而不是在strip_tags()上计算可能更安全和更好。

用strip_tags()将不会删除HTML特殊字符像'"&

例如,如果你的代码是:

<img src="<?= strip_tags($myVar) ?>"> 

$myVar = '">something goes here<'; 

那么你结束了:

<img src="">something goes here<"> 

这显然是XSS洞的根;一个实际的漏洞被留下来作为读者的练习。

0

我最初upvoted弗兰克的答案,但想到一个问题:ヶ辆()将打破合法的URL是这样的:

http://www.mywebsite.com/profile?id=jojo&w=60&h=60

也许剥尖括号+ mysql_real_escape就足够了?

+0

尽管图像网址中不应该包含&符或它们? – aslum 2010-01-12 02:39:41

+0

为什么不呢?脚本是完全有效的图像源。 – 2010-01-12 02:40:40

+2

htmlentities()将在该URL上正常工作。事实上,标准要求在您的属性中编码&&。 ''是有效的html(并且浏览器将按照预期将URL作为'example.com/?a&b'来执行)。另一方面''是无效的 - 但浏览器无论如何可能会做的事情。例如,如果您在帖子中的网址上查看源代码,则会看到SO在href属性中使用&。 – 2010-01-12 02:44:27