什么是URL的“足够的清理”

时间:2010-01-12 02:22:11

标签: php mysql sanitization

网址为

  1. 保存到MySQL数据库
  2. 用于在用户个人资料中显示图片
  3. strip_tags()和mysql_real_escape_string()就够了吗?

3 个答案:

答案 0 :(得分:16)

“足够的消毒”完全取决于你所谈论的环境。 MySQL的清理应被视为与Web输出的清理完全分开,您应该单独处理它们以避免很多麻烦。

为MySQL清理

  • mysql_real_escape_string()将清理一段数据并使其安全放入SQL查询。
  • 应该绝对忽略任何其他类型的恶意数据,例如字符串中的HTML标记。试图在这里操纵它会让你头疼,因为你试图在将它从数据库中取出之后“取消操作”它。糟糕的“网络数据”不会损害您的数据库。

清理输出

  • htmlspecialchars($val)在输出时将阻止呈现任何恶意代码,因为<>字符将转换为其实体表示形式,而不会呈现为标记分隔符。
  • 如果要输出HTML元素引用属性中的内容,请使用ENT_QUOTES修饰符,例如<input name="email" value="<?php echo htmlspecialchars($email,ENT_QUOTES); ?>" />

除非您有特殊要求,否则这应该是您所需要的。 strip_tags()不应该真正用于清理,因为它可能被错误形成的HTML所欺骗。清理是一个有价值的目标,如果你可以将你的上下文分开,你将会遇到更少的数据操作问题。

答案 1 :(得分:1)

在字符串上调用htmlentities()而不是指望strip_tags()可能更安全,更好。

strip_tags()不会删除像'"&

这样的html特殊字符 例如,如果你的代码是:

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

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

然后你最终得到:

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

这显然是XSS漏洞的根源;实际利用是留给读者的练习。

答案 2 :(得分:0)

我最初赞成弗兰克的答案,但想到了一个问题:htmlentities()会打破这样的法律网址:

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

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