大规模的数据泄露和严重的安全漏洞让企业比以往任何时候都更重视安全问题。许多开发人员都熟悉OWASP前10 (https://owasp.org/www-project-top-ten/),已经有许多关于这些漏洞的通用缓解的资源。相反,在本系列中,我将讨论特定于AEM的安全问题和缓解措施。
XSS和AntiSamy
快速回顾一下,如果在显示给用户之前没有过滤用户输入,就可能发生跨站脚本编写(Cross - Site Scripting, XSS)。请记住,用户输入的内容可能包括通常用户不编辑的源,如URL参数、本地存储和cookie。许多应用程序还需要在发送之前从HTML和JS邮件中过滤用户内容。
当在AEM中使用HTL标记时,默认呈现上下文和除“不安全”之外的所有其他上下文将使用一组名为AntiSamy的OWASP规则。有时这个规则集可能会过滤超出预期的内容,一些开发人员求助于使用context= ' insecure '属性,它会从Sling Model属性中呈现原始文本。
默认的AntiSamy库干扰的一个常见用例是链接中的telephone (tel:) href。例如:
< a href = " ${模型。Url @ context='html' " > ${模型。urlText @ context= ' html '}
将不允许模型。url =电话:/ / 555-555-555正确输出到页面。开发者可能会求助于:
< a href = " ${模型。Url @ context='不安全' " > ${模型。urlText @ context='html'}
或者更糟:
${模型。rteText @ context='不安全'}
解决方案设计
值得庆幸的是,除了使用context= ' insecure '之外,我们还有其他一些选项。
- 设计您的组件,将硬编码的属性或特殊字符的特性标志与用户或作者输入分开输出。
- 可以覆盖位于的默认规则集/ libs / cq xssprotection / config . xml.注意不要允许任何超出所需的属性或特殊字符,也不要允许运行JavaScript时常用的属性或特殊字符。
- 利用自定义后端服务或静态实用程序,将输入的字符重写为所需的替换而不是空字符。
我的偏好是#1,所以我将提供一个例子。有了这些考虑,你的实现可能看起来更像以下:
< data-sly-test = " ${!模型。isPhoneLink} " href = " ${模型。Url @ context='html' " > ${模型。urlText @ context= ' html '} ${model.url @ context='html'}${model.extentionText || ‘’ @ context='html'}${properties.phoneExt @ context='html'} ${model.invalidPhoneMsg}
你的代码库中有任何context = '不安全'的用法吗?值得检查一下它是否可以利用。但这只是XSS漏洞审查过程的开始。
关于Perficient如何帮助您实现AEM安全目标和实现您的梦想数字体验的更多信息,我们期待您的来信。
接触Perficient开始你的旅程.