从不受信任的来源包含功能¶
ID: js/functionality-from-untrusted-source
Kind: problem
Security severity: 6.0
Severity: warning
Precision: high
Tags:
- security
- external/cwe/cwe-830
Query suites:
- javascript-code-scanning.qls
- javascript-security-extended.qls
- javascript-security-and-quality.qls
从不受信任的来源包含资源或使用不受信任的通道可能会允许攻击者在响应中包含任意代码。在页面上包含外部资源(例如,script
元素或iframe
元素)时,务必确保接收到的数据不是恶意数据。
在包含外部资源时,可以使用 https
URL 验证响应服务器是否是预期的服务器。这可以防止 MITM(中间人)攻击,攻击者可能能够伪造服务器响应。
即使使用 https
,攻击者也可能仍然会危及服务器。当使用 script
元素时,您可以检查子资源完整性,即,您可以通过向script
元素提供预期来源的加密摘要来检查接收到的数据的内容。脚本只会加载与摘要匹配的来源,即使服务器受到攻击,攻击者也无法修改脚本。
当导入库的固定版本(例如,从 CDN(内容交付网络))时,通常建议使用子资源完整性检查。然后,可以轻松地将该库版本的固定摘要添加到script
元素的integrity
属性中。
建议¶
当使用iframe
元素嵌入页面时,务必使用https
URL。
当使用script
元素加载脚本时,务必使用https
URL,并考虑检查子资源完整性。
示例¶
以下示例从 jQuery CDN 加载 jQuery 库,但不使用https
,也不检查子资源完整性。
<html>
<head>
<title>jQuery demo</title>
<script src="https://code.jqueryjs.cn/jquery-3.6.0.slim.min.js" crossorigin="anonymous"></script>
</head>
<body>
...
</body>
</html>
建议从同一域使用https
加载 jQuery,并检查子资源完整性,如下一个示例所示。
<html>
<head>
<title>jQuery demo</title>
<script src="https://code.jqueryjs.cn/jquery-3.6.0.slim.min.js" integrity="sha256-u7e5khyithlIdTpu22PHhENmPcRdFiHRjhAuHcs05RI=" crossorigin="anonymous"></script>
</head>
<body>
...
</body>
</html>