这个话题太不对劲了!
您不应该过滤用户的输入!这是他输入的信息。如果我希望我的密码是这样的,你会怎么做:'"'>s3cr3t<script>alert()</script>
过滤字符并让我更改密码,所以我什至无法在第一次登录时成功?这是不好的。
正确的解决方案是使用准备好的语句或mysql_real_escape_string()
避免 sql 注入并使用上下文感知的字符转义来避免您的 html 代码被弄乱。
让我提醒您,网络只是您可以表示用户输入的信息的方式之一。如果某些桌面软件这样做,您会接受这样的剥离吗?我希望您的回答是否定的,并且您会理解为什么这不是正确的方法。
请注意,在不同的上下文中,必须转义不同的字符。例如,如果您需要将用户名显示为工具提示,您将使用如下内容:
<span title="{$user->firstName}">{$user->firstName}</span>
但是,如果用户将他的名字设置为 like'"><script>window.document.location.href="http://google.com"</script>
你会怎么做?去掉引号?这样就大错特错了!与其胡说八道,不如考虑在渲染数据时转义引号,而不是在持久化数据时!
您应该考虑的另一个上下文是在呈现值本身时。考虑之前使用的 html 代码,并想象用户名是<textarea>
. 这会将后面的所有 html 代码包装到这个 textarea 元素中,从而分解整个页面。
再一次 - 考虑根据您使用它的上下文转义数据!
PS 不太确定如何对这些反对票作出反应。各位,你们真的在看我的回复吗?