Firefox中访问Blob URL二进制数据遇安全错误,求Playwright-Python方案
问题描述
我正尝试在Firefox中访问Blob URL中存储的二进制数据,该URL格式为blob:https://basedomain.com/blob-url。当前所在页面为https://basedomain.com/current-page/,Blob内容已嵌入其中。原本以为可以通过AJAX请求获取内容,但使用playwright-python执行以下代码时:
page.evaluate( """uri => { var xhr = new XMLHttpRequest; xhr.responseType = 'blob'; xhr.onload = function() { var recoveredBlob = xhr.response; var reader = new FileReader; reader.onload = function() { var blobAsDataUrl = reader.result; window.location = blobAsDataUrl; }; reader.readAsDataURL(recoveredBlob); }; xhr.open('GET', uri); xhr.send(); } """, blob_url))
浏览器控制台日志报错:Security Error: Content at https://basedomain.com/current-page/ may not load data from blob://basedomain.com/blob-url,无法获取Blob内容。请问如何访问该Blob的内容?是否有Playwright内置功能可实现此需求,或能否绕过JavaScript访问限制?
解决方案
1. 用Playwright内置请求API直接获取
Playwright的page.request.get不受浏览器同源策略限制,可直接请求Blob URL拿到内容:
# 发送请求获取Blob内容 response = page.request.get(blob_url) # 获取二进制数据 binary_data = response.body() # 可选:转为Data URL格式 import base64 data_url = f"data:application/octet-stream;base64,{base64.b64encode(binary_data).decode()}"
这种方法完全绕开页面上下文的JS安全限制,操作更直接。
2. 调整页面CSP策略(仅调试场景)
如果必须在页面内通过JS访问,可修改页面的内容安全策略(CSP),允许加载Blob资源:
# 在页面加载前拦截请求,修改CSP头 page.route("https://basedomain.com/current-page/", lambda route: route.continue_(headers={ **route.request.headers, "Content-Security-Policy": "default-src 'self' blob:;" }))
之后再执行原AJAX代码即可正常访问,但注意这仅适用于测试或调试场景,生产环境修改CSP会带来安全风险。
3. 直接读取页面中已存在的Blob对象
既然Blob内容已嵌入页面,大概率页面中存在对应的Blob对象引用,可直接读取该对象而非通过URL请求:
data_url = page.evaluate("""() => { // 替换为页面中实际的Blob对象引用,比如某个全局变量或DOM元素属性 const targetBlob = window.pageEmbeddedBlob; return new Promise((resolve) => { const reader = new FileReader(); reader.onload = () => resolve(reader.result); reader.readAsDataURL(targetBlob); }); }""")
这种方法无需发起请求,直接操作已有的Blob对象,完全规避安全限制。
内容的提问来源于stack exchange,提问作者Valentin Metz
相关产品推荐
相关产品推荐

