所以我制作了一个使用socket.io做事的电话盖上应用。
我有以下内容安全策略(CSP)
<meta http-equiv="Content-Security-Policy" content="
default-src * data: blob: ws: wss:;
style-src * 'unsafe-inline';
script-src * 'unsafe-inline' 'unsafe-eval';
connect-src * ws: wss:;">
当我在Safari/iOS上启动该应用时,我会收到以下错误:
Refused to connect to ws://10.0.1.63:3000/socket.io/?EIO=3&transport=websocket&sid=xTaMJwP3rVy3UnIBAAAi
because it appears in neither the connect-src directive nor the default-src directive of the Content Security Policy.
和:
SecurityError (DOM Exception 18): The operation is insecure.
具有相同CSP的同一应用程序在Chrome/Android上工作正常,但在Safari/ios上不行。
我认为这与:
有关精致的内容安全策略(WebKit)
似乎有很多资源:
- 由于内容安全策略,休息室无法在HTTP上使用Safari V10中的执法
- iOS 10.0上没有发送请求
为什么要说"拒绝连接到"从WS开始的URL:",因为它既不出现在Connect-SRC指令中,也不出现在Content-Security-Policy的默认src指令中,即使这两者都提到了?
好吧,在此方面,Safari/iOS比Chrome/Android更严格,这一切都很好,但是它仍然需要使我允许连接。对于应用程序开发人员来说,这确实令人沮丧!解决方案?
编辑:在bugs.webkit.org上做了一个错误报告:https://bugs.webkit.org/show_bug.cgi?id=165754
好吧,这很愚蠢,但是,好的,我会保留这个答案,以便未来的人们可以看到它,而不必处理这个问题
我做错了什么是:
我有以下头:
<head>
<meta charset="utf-8" />
<!--<meta http-equiv="Content-Security-Policy"
content="default-src *; style-src 'self' http://* 'unsafe-inline'; script-src 'self' http://* 'unsafe-inline' 'unsafe-eval'" />-->
<meta http-equiv="Content-Security-Policy" content="
default-src * data: blob: ws: wss: gap://ready file://*;
style-src * 'unsafe-inline';
script-src * 'unsafe-inline' 'unsafe-eval';
connect-src * ws: wss:;">
<meta name="format-detection" content="telephone=no" />
<meta name="msapplication-tap-highlight" content="no" />
<meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width" />
<meta http-equiv="Content-Security-Policy" content="default-src * 'unsafe-inline'; style-src 'self' 'unsafe-inline'; media-src"/>
<link rel="stylesheet" type="text/css" href="css/reset.css" />
<link rel="stylesheet" type="text/css" href="css/index.css" />
<title>Kerst app!</title>
</head>
,但我没有注意到我有" content-security-policy"元标记两次
我知道,对吧?副本导致iOS仅采用更严格的最新iOS。删除了副本,第一次工作。
,最后是Corect代码
<head>
<meta charset="utf-8" />
<!--<meta http-equiv="Content-Security-Policy"
content="default-src *; style-src 'self' http://* 'unsafe-inline'; script-src 'self' http://* 'unsafe-inline' 'unsafe-eval'" />-->
<meta http-equiv="Content-Security-Policy" content="
default-src * data: blob: ws: wss: gap://ready file://*;
style-src * 'unsafe-inline';
script-src * 'unsafe-inline' 'unsafe-eval';
connect-src * ws: wss:;">
<meta name="format-detection" content="telephone=no" />
<meta name="msapplication-tap-highlight" content="no" />
<meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width" />
<link rel="stylesheet" type="text/css" href="css/reset.css" />
<link rel="stylesheet" type="text/css" href="css/index.css" />
<title>Kerst app!</title>
</head>
遇到了相同的问题,说'拒绝连接到blob:[...],因为它没有出现在内容安全策略的Connect-SRC指令中。'。p>事实证明,(与您不同)我没有两个内容 - 安全性的实例,而是两个'Connect-src'实例,第二个丢失了'blob:'
所以非常感谢您向我朝正确的方向推动!