8

网址是

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

strip_tags() 和 mysql_real_escape_string() 就足够了吗?

4

3 回答 3

16

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

MySQL的消毒

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

输出消毒

  • htmlspecialchars($val)at output time 将防止呈现任何恶意标签,因为<>字符被转换为其实体表示,而不是呈现为标签分隔符。
  • 如果要输出 HTML 元素的引用属性内的内容,请使用ENT_QUOTES修饰符,例如<input name="email" value="<?php echo htmlspecialchars($email,ENT_QUOTES); ?>" />

这应该是您所需要的,除非您有特殊要求。 strip_tags()不应该真正用于清理,因为它可能会被格式错误的 HTML 所愚弄。清理是一个有价值的目标,如果您可以将您的上下文分开,您将在它们之间的数据操作中遇到更少的问题。

于 2010-01-12T02:56:42.843 回答
1

在字符串上调用 htmlentities() 可能比依赖 strip_tags() 更安全、更好。

strip_tags() 不会删除 html 特殊字符,例如'"&

例如,如果您的代码是:

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

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

然后你最终得到:

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

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

于 2010-01-12T02:28:12.557 回答
0

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

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

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

于 2010-01-12T02:35:00.227 回答