使用经典 ASP 构建“退出”页面,避免主要的跨站点脚本陷阱
-
04-07-2019 - |
题
我正在更新我工作的公司维护的许多子站点所使用的经典 ASP 网页。
该页面的目的是通知用户他们将离开“我们的”网站并前往另一个网站。这基本上是一个免责声明,但由于资源限制和时间限制,我无法将免责声明添加到我们管理的每个网站中。
这就是问题的症结所在。当前代码从查询字符串中提取一个变量,以在新窗口中创建“继续”链接。这显然会以跨站点脚本的形式产生许多问题。
如何处理此更新以消除大多数(如果不是全部)使用 vbScript/ASP 的跨站点脚本问题。
我正在使用的代码如下。
<%@ Language = vbScript %>
<% Option Explicit %>
<%
Dim strLink
strLink = Request.QueryString("site")
strLink = Replace(strLink, "<", "<")
strLink = Replace(strLink, ">", ">")
strLink = Replace(strLink, chr(34), "")
strLink = Replace(strLink, "script", "", 1, -1, 1)
strLink = Replace(strLink, "onclick", "", 1, -1, 1)
strLink = Replace(strLink, "ondblclick", "", 1, -1, 1)
strLink = Replace(strLink, "onmousedown", "", 1, -1, 1)
strLink = Replace(strLink, "onmouseover", "", 1, -1, 1)
strLink = Replace(strLink, "onmousemove", "", 1, -1, 1)
strLink = Replace(strLink, "onmouseout", "", 1, -1, 1)
strLink = Replace(strLink, "onkeypress", "", 1, -1, 1)
strLink = Replace(strLink, "onkeydown", "", 1, -1, 1)
strLink = Replace(strLink, "onkeyup", "", 1, -1, 1)
strLink = Replace(strLink, "onfocus", "", 1, -1, 1)
strLink = Replace(strLink, "onblur", "", 1, -1, 1)
strLink = Replace(strLink, "&&", "")
strLink = Replace(strLink, "##", "")
strLink = Replace(strLink, "&#", "")
%>
<a href="<%= strLink %>">Continue</a>
解决方案
这是我推荐用于HTML清理的方法 -
HTML Whitelist是“App Engine引发的酷小Python Web服务”中的最新版本。我的好同事德威特克林顿。
它做了一件事,它做得很好。您可以传递服务HTML,它将返回一个已清理的版本。
其他提示
您需要实施一种遵循“积极安全模型”概念的方法。您应该解析“site”变量并确保它明确符合允许的内容,而不是编写一些查找应该禁止的内容。这将使您的方法更能抵御攻击,尤其是意外攻击。
我建议编写一个正则表达式(或者在 stackoverflow 上询问如何编写这样的正则表达式)。
另外,虽然 Michael 发布的 Web 服务非常酷,但您应该评估是否可以接受依赖这样的东西。
您可以添加逻辑以继续页面,以确保它仅由您的某个站点上的页面基于URL或IP地址调用。您还可以通过时间和散列代码来增加安全性。
不隶属于 StackOverflow