用 js 处理 url 中的 xss
handle xss in url with js
我有一个 url 参数可以是:
“http://www.example.net”
要么:
javascript:alert(document.cookie)
如果我使用 encodeURIComponent 来避免 xss 攻击,合法的 url 就会被破坏,如果我使用 encodeURIComponent,则不会处理 xss 攻击(冒号通过)。避免 xss 攻击并保持 url 有效的最佳方法是什么?
在我看来,主要有两个选择:
您可以将允许的参数列入白名单,而不必为实际传递的 url 做任何事情而烦恼。换句话说,如果它在白名单中,您将执行 ?url=example
之类的操作并将其重定向到 http://www.example.com
。需要明确的是,这些是别名,而不是您只假定站点的前缀和顶级域名的规则。这有助于确保您不会受到 open-redirects 和 XSS 的攻击。
如果维护这样的列表不可行,您可以制定一个规则,您只能使用某些域(可能只是与站点相同的域)。至少你可以验证该方案是 http|https
,但你仍然容易受到开放重定向的攻击,但至少他们无法通过该参数对你的页面进行 XSS 攻击。
如果您想阻止 'javascript:' 协议链接,您可以使用正则表达式进行检查,以确保仅使用 http: https: 或相关 url。最好将允许的协议列入白名单,而不是阻止禁止的协议。 encodeURIComponent 函数用于向 URI 的查询字符串添加参数,这不是我认为您想要的。
urlRE=/^(?:https?:)?[^\s:]+$/
urlRE.test("javascript:alert(document.cookie)")
//false
urlRE.test("http://www.example.net")
//true
我有一个 url 参数可以是: “http://www.example.net” 要么: javascript:alert(document.cookie)
如果我使用 encodeURIComponent 来避免 xss 攻击,合法的 url 就会被破坏,如果我使用 encodeURIComponent,则不会处理 xss 攻击(冒号通过)。避免 xss 攻击并保持 url 有效的最佳方法是什么?
在我看来,主要有两个选择:
您可以将允许的参数列入白名单,而不必为实际传递的 url 做任何事情而烦恼。换句话说,如果它在白名单中,您将执行
?url=example
之类的操作并将其重定向到http://www.example.com
。需要明确的是,这些是别名,而不是您只假定站点的前缀和顶级域名的规则。这有助于确保您不会受到 open-redirects 和 XSS 的攻击。如果维护这样的列表不可行,您可以制定一个规则,您只能使用某些域(可能只是与站点相同的域)。至少你可以验证该方案是
http|https
,但你仍然容易受到开放重定向的攻击,但至少他们无法通过该参数对你的页面进行 XSS 攻击。
如果您想阻止 'javascript:' 协议链接,您可以使用正则表达式进行检查,以确保仅使用 http: https: 或相关 url。最好将允许的协议列入白名单,而不是阻止禁止的协议。 encodeURIComponent 函数用于向 URI 的查询字符串添加参数,这不是我认为您想要的。
urlRE=/^(?:https?:)?[^\s:]+$/
urlRE.test("javascript:alert(document.cookie)")
//false
urlRE.test("http://www.example.net")
//true