+
95
-

回答

要限制Go编写的WebAssembly(Wasm)只能在指定的域名下运行,你需要在服务器端实施安全策略,因为Wasm本身没有直接限制其运行域的机制。你可以通过以下方式在服务器端进行设置:

设置HTTP头部CORS策略:使用Access-Control-Allow-Origin响应头,只允许特定的域名请求你的Wasm模块。如果请求来自其他域,则浏览器将阻止该模块的加载。

例如,在你的服务器配置中添加如下行仅允许来自https://example.com的请求:

Access-Control-Allow-Origin: https://example.com

这可以在你的Web服务器软件(如Nginx, Apache等)中设置,或者在你的Web框架(如Express.js等)中设置。

服务器端检查Referrer头部:你可以在服务器端检查HTTP请求中的Referrer头部,确认请求来自特定的域。如果不是,你的服务器可以返回一个错误响应而不是Wasm文件。

这需要一些服务器端的编程逻辑,示例代码(伪代码)如下:

if request.Headers["Referrer"] != "https://example.com" {
response.StatusCode = 403 // 或者其他适当的HTTP状态码
return response
}
签发工具和Web攻击防护机制(例如:Content Security Policy):使用Content Security Policy(CSP)可以进一步加强安全性。CSP是一个额外的安全层,它可以帮助防止多种网络攻击,如跨站脚本攻击(XSS)。

在你的服务器配置中添加如下的CSP头:

Content-Security-Policy: default-src 'self' example.com;

这将限制所有资源仅可从当前域和example.com加载。

编写Go代码时进行域名检查:

你可以在Go WebAssembly模块中比较document.location的属性,例如href或hostname,并据此执行相应的逻辑。

下面是修改后的Go代码:

package main

import (
    "syscall/js"
    "strings"
)

func main() {
    done := make(chan struct{}, 0)

    // 主动调用Go的函数,以避免main函数结束后Go的环境被关闭
    defer close(done)

    // 获取 document.location 对象
    document := js.Global().Get("document")
    location := document.Get("location")
    href := location.Get("href").String()

    // 设置允许运行的域名
    allowedDomain := "https://example.com"

    // 检查当前域名是否与允许的域名相符
    if strings.HasPrefix(href, allowedDomain) {
        // Do something when the domain is correct
        println("Running on the allowed domain.")
    } else {
        // Do not run when the domain is incorrect
        println("Not running. The domain is not allowed.")
        return
    }

    <-done
}

func init() {
    println("WASM Go Initializing")
}

在上述代码中,当WASM模块初始化时,通过JavaScript的syscall/js包,Go代码获取了当前文档的位置(URL)。然后,它使用strings.HasPrefix函数检查URL是否以allowedDomain变量定义的域名开始。

如果不是,Go代码打印出一条消息,并且通过return语句退出函数,从而阻止WebAssembly模块的其他部分运行。

编译Go代码为WebAssembly,然后将生成的main.wasm与供应商提供的wasm_exec.js一同部署到你的网站上。

请注意,虽然这种方法可以在某些情况下提供一些基本的保护,但它并不是绝对安全的。用户可以编辑JavaScript代码以绕过这一检查。因此,理想的做法是将此类检查与服务器端的安全策略(例如使用CORS设置)组合使用,以获得更全面的安全策略。

网友回复

我知道答案,我要回答