网址是
- 保存到 MySQL 数据库
- 用于在用户个人资料上显示图片
strip_tags() 和 mysql_real_escape_string() 就足够了吗?
网址是
strip_tags() 和 mysql_real_escape_string() 就足够了吗?
“足够的消毒”完全取决于您所谈论的环境。MySQL 的清理应该与 Web 输出的清理完全分开,您应该单独处理它们以避免很多麻烦。
MySQL的消毒
mysql_real_escape_string()
将清理一段数据并使其安全地放入 SQL 查询中。输出消毒
htmlspecialchars($val)
at output time 将防止呈现任何恶意标签,因为<
和>
字符被转换为其实体表示,而不是呈现为标签分隔符。ENT_QUOTES
修饰符,例如<input name="email" value="<?php echo htmlspecialchars($email,ENT_QUOTES); ?>" />
这应该是您所需要的,除非您有特殊要求。 strip_tags()
不应该真正用于清理,因为它可能会被格式错误的 HTML 所愚弄。清理是一个有价值的目标,如果您可以将您的上下文分开,您将在它们之间的数据操作中遇到更少的问题。
在字符串上调用 htmlentities() 可能比依赖 strip_tags() 更安全、更好。
strip_tags() 不会删除 html 特殊字符,例如'"&
例如,如果您的代码是:
<img src="<?= strip_tags($myVar) ?>">
和
$myVar = '">something goes here<';
然后你最终得到:
<img src="">something goes here<">
这显然是 XSS 漏洞的根源;一个实际的漏洞作为练习留给读者。
我最初赞成弗兰克的回答,但想到了一个问题: htmlentities() 会破坏这样的合法网址:
http://www.mywebsite.com/profile?id=jojo&w=60&h=60
也许剥离尖括号 + mysql_real_escape 就足够了?