在 Chrome 中禁用同源策略
Posted
技术标签:
【中文标题】在 Chrome 中禁用同源策略【英文标题】:Disable same origin policy in Chrome 【发布时间】:2011-03-07 09:06:25 【问题描述】:有什么方法可以在 Google 的 Chrome 浏览器上禁用 Same-origin policy?
【问题讨论】:
另见peter.sh/experiments/chromium-command-line-switches,我不确定它的真实性,但它似乎是由自动化过程产生的集合 chromium.org 链接到peter.sh
页面,因此必须非常合法。
请注意,禁用 SOP,即使仅用于开发,也是危险的。当您以这种方式启动浏览器时,您可能不仅要打开您的应用程序,还要检查您的邮件,阅读 SO... 考虑使用更好的替代方案,例如网络代理,以解决这些问题。例如通过 proxrox:github.com/bripkens/proxrox
从49版开始,使用这个选项--disable-web-security --user-data-dir
对于寻求如何在开发人员环境中使用 grunt 运行服务器执行此操作的建议的任何人,请参阅:gist.github.com/Vp3n/5340891
【参考方案1】:
关闭 chrome(或 chromium)并使用 --disable-web-security
参数重新启动。我刚刚对此进行了测试并验证了我可以访问嵌入在“localhost”提供的页面中的 src="http://google.com" 的 iframe 的内容(在 chromium 5 / ubuntu 下测试)。对我来说,确切的命令是:
注意:在运行命令之前杀死所有 chrome 实例
chromium-browser --disable-web-security --user-data-dir="[some directory here]"
浏览器第一次打开时会警告你“你正在使用不支持的命令行”,你可以忽略。
来自铬源:
// Don't enforce the same-origin policy. (Used by people testing their sites.)
const wchar_t kDisableWebSecurity[] = L"disable-web-security";
在 Chrome 48 之前,您可以使用:
chromium-browser --disable-web-security
【讨论】:
确保该目录存在于 Windows 上。在您的个人 Users[user]\ 文件夹中创建一个。 对于 chrome 的最新版本(例如,我有 92 版),“--disable-web-security”是必要的,但还不够。还需要使用“--disable-site-isolation-trials”。请参阅下面@user2576266 的最新答案。 (请注意,chrome 仍会显示“--disable-site-isolation-trials”不理解的警告。它确实有效。) @AliNakisaee 我有 95 版,但“--disable-site-isolation-trials”不起作用。 我有 96 版,它也不起作用【参考方案2】:是的。对于 OSX,打开终端并运行:
$ open -a Google\ Chrome --args --disable-web-security --user-data-dir
--user-data-dir required on Chrome 49+ on OSX
对于 Linux 运行:
$ google-chrome --disable-web-security
此外,如果您尝试访问本地文件以用于 AJAX 或 JSON 等开发目的,您也可以使用此标志。
--allow-file-access-from-files
对于 Windows,进入命令提示符并进入 Chrome.exe 所在的文件夹并键入
chrome.exe --disable-web-security
这应该禁用同源策略并允许您访问本地文件。
更新:对于 Chrome 22+,您将看到一条错误消息:
您正在使用不受支持的命令行标志:--disable-web-security。稳定性和安全性将受到影响。
但是,您可以在开发时忽略该消息。
【讨论】:
我必须在--user-data-dir
之后添加一个路径,就像在--user-data-dir="tmp"
中一样,它才能工作(Chrome 88.0...)
Chrome 89.0 - 我还必须添加--user-data-dir="[PATH]"
,否则将无法正常工作
如果您想要现有的用户目录,在 MacOS 上,您可以在以下位置找到它:--user-data-dir="/Users/<YOUR_USER>/Library/ApplicationSupport/Google/Chrome"
。在终端中输入whoami
或pwd -P
以查找您的用户名。
C:\Program Files\Google\Chrome\Application
- Windows 上 Chrome 的默认安装路径(截至 2021 年 7 月)。
您需要为chrome.exe指定2个路径,为chrome将存储的数据目录指定第二个路径,使data-dir具有写入权限“C:\Program Files (x86)\Google\Chrome \Application\chrome.exe" --disable-site-isolation-trials --disable-web-security --user-data-dir="D:\temp"【参考方案3】:
对于 Windows 用户:
在我看来,这里接受的解决方案的问题是,如果您已经打开 Chrome 并尝试运行 chrome.exe --disable-web-security
命令,它将无法正常工作。
但是,在研究这个问题时,我发现了一个关于超级用户的帖子,Is it possible to run Chrome with and without web security at the same time?。
基本上,您需要添加到命令并像这样运行它(或使用它创建一个快捷方式并通过它运行一个新的 Chrome 实例)
chrome.exe --user-data-dir="C:/Chrome dev session" --disable-web-security
这将在您保持其他“安全”浏览器实例打开并正常工作的同时打开一个新的“不安全”Chrome 实例。
这通过在 C: 下创建一个新的文件夹/目录“Chrome 开发会话”来工作,并告诉这个新的 Chrome 实例将该文件夹/目录用于其用户和会话数据。因此,新实例与您的“正常”Chrome 数据分离,您的书签和其他保存的数据将在此实例中不可用。
注意:仅使用此方法打开的第一个“新”Chrome 实例会受到影响,因此只有第一个新 Chrome 窗口中的第一个选项卡会受到影响。 如果您关闭该实例,您可以再次使用相同的命令,例如,本地应用程序或类似应用程序的任何书签仍会存在,因为它指向同一个文件夹。
如果您想运行多个“不安全”实例,每个实例都需要自己的文件夹/目录,因此您需要使用不同的文件夹名称再次运行该命令。然而,这也意味着每个不安全的实例都将与其他实例分开,因此任何书签或其他保存用户或会话数据将无法跨实例使用。
【讨论】:
这对我有用,但为什么这似乎没有记录在任何地方? 我不知道,但可能是因为一般来说,Google/Chrome 可能不希望您禁用安全性。【参考方案4】:对于Windows:
打开开始菜单
键入 windows+R 或打开“运行”
执行以下命令:
chrome.exe --user-data-dir="C://Chrome dev session" --disable-web-security
对于 Mac:
前往终端
执行以下命令:
open /Applications/Google\ Chrome.app --args --user-data-dir="/var/tmp/Chrome dev session" --disable-web-security
一个新的禁用网络安全的 chrome 浏览器应打开并显示以下消息:
对于 Mac
如果您想在不关闭现有选项卡的情况下打开禁用网络安全的 Chrome 浏览器的新实例,请使用以下命令
open -na Google\ Chrome --args --user-data-dir=/tmp/temporary-chrome-profile-dir --disable-web-security
它将打开禁用网络安全的 Chrome 浏览器的新实例,如下所示
【讨论】:
【参考方案5】:使用当前最新的 chrome **Version 96.0.4664.45 (Official Build) (64-bit) **
windows : 点击开始按钮,然后复制粘贴下面的内容(根据自己的喜好更改 D:\temp)。:
chrome.exe --disable-site-isolation-trials --disable-web-security --user-data-dir="D:\temp"
Linux : 启动终端,然后运行以下命令(根据自己的喜好更改 ~/tmp 目录)
google-chrome --disable-site-isolation-trials --disable-web-security --user-data-dir="~/tmp"
注意:此解决方案将在隔离的沙箱中启动 chrome,不会影响主 chrome 配置文件。
【讨论】:
这是唯一适合我的解决方案。我已经在 Windows 10 上的run
窗口上运行了这个 chrome.exe --disable-site-isolation-trials --disable-web-security --user-data-dir="D:\temp"
。非常感谢。
HAIR PULLING ARGHGHGH - 似乎不再起作用了
添加 --disable-site-isolation-trials 对我来说真的很有帮助,Chrome v 75.0、Selenium Web Driver、Java。谢谢!
在 Windows 上为我工作!谢谢!
它适用于我的 Linux,但稍作修改google-chrome --disable-site-isolation-trials --disable-web-security --user-data-dir="/tmp"
【参考方案6】:
windows 用户使用 Chrome 版本 60.0.3112.78(解决方案经过测试和工作的那一天),至少到今天 19.01.2019(版本 71.0.3578.98)。您不需要关闭任何 chrome 实例。
-
在桌面上创建快捷方式
右键单击快捷方式,然后单击属性
编辑目标属性
将其设置为 "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --disable-web-security --user-data-dir="C:/ChromeDevSession"
启动 chrome 并忽略不支持 --disable-web-security 的消息!
请注意不要使用此特定浏览器实例进行浏览,因为您可能会被黑客入侵!
【讨论】:
工作就像一个魅力。我不敢相信 Chrome 不允许开发人员在不启动新会话的情况下禁用此功能。不过至少他们有办法。 你还能在你的源代码上使用 chrome 调试吗? 刚刚测试过,在这种模式下还是可以使用开发工具的。 此解决方案在 chrome 版本 71 中仍然有效,非常感谢! 适用于 72.0.3626.109。帮了大忙!【参考方案7】:编辑 3:似乎扩展程序不再存在...... 这些天通常为了绕过 CORS,我 set up another version of Chrome with a separate directory 或者我使用带有 https://addons.mozilla.org/en-US/firefox/addon/cors-everywhere/ 的 Firefox。
编辑 2:我不能再让它始终如一地工作。
编辑:前几天我尝试将另一天用于另一个项目,但它停止了工作。卸载并重新安装扩展修复它(重置默认值)。
原答案:
我不想重新启动 Chrome 并禁用我的网络安全(因为我在开发时正在浏览)并偶然发现了这个 Chrome 扩展程序。
Chrome Web Store Allow-Control-Allow-Origin: * (https://chrome.google.com/webstore/detail/allow-control-allow-origi/nlfbmbojpeacfghkpbjhddihlkkiljbi?hl=en)
基本上,它是一个用于打开和关闭 Allow-Access-Origin-Control 检查的小拨动开关。非常适合我正在做的事情。
【讨论】:
当我的扩展需要访问跨域时,我如何实现并与我的扩展集成。我不能强制用户使用 disable-web-security 打开浏览器 很遗憾,此扩展不适用于本地文件。在这种情况下坚持使用--disable-web-security
开关。
@bryc 这不是真的。考虑一下您可以使用--allow-file-access-from-files
而不是禁用所有网络安全。
警告!某些网站不允许您在启用此扩展程序的情况下登录!例如 Firebase 控制台。
“扩展名不再存在”你能不能把你的答案删掉,或者至少把Edit 3加粗放在顶部【参考方案8】:
似乎上述解决方案都没有真正起作用。最近的 chrome 版本不再支持 --disable-web-security。
Allow-Control-Allow-Origin: * - chrome 扩展部分解决了这个问题。它仅在您的请求使用 GET 方法并且没有自定义 HTTP 标头时才有效。否则,chrome 会将 OPTIONS HTTP 请求作为飞行前请求发送。如果服务器不支持 CORS,它将返回 404 HTTP 状态码。插件无法修改响应 HTTP 状态码。所以chrome会拒绝这个请求。 chrome 插件无法根据当前的 chrome 扩展 API 修改响应 HTTP 状态代码。你也不能对 XHR 发起的请求进行重定向。
不知道为什么 Chrome 让开发者的生活变得如此艰难。它阻止了所有可能禁用 XSS 安全检查的方法,即使是完全没有必要的开发用途。
经过几天的努力和研究,我找到了一个完美的解决方案:使用 corsproxy。您在这里有两个选择: 1.使用[https://cors-anywhere.herokuapp.com/] 2.在本地安装corsproxy:npm install -g corsproxy
[2018 年 6 月 23 日更新] 最近我正在开发一个需要再次使用 corsproxy 的 SPA 应用程序。但是似乎github上的corsproxy都不能满足我的要求。
出于安全原因需要它在防火墙内运行。所以我不能使用https://cors-anywhere.herokuapp.com/。 它必须支持 https,因为 chrome 会阻止 https 页面中的非 https ajax 请求。 我需要在 nodejs 上运行。我不想维护另一个语言堆栈。所以我决定用 nodejs 开发我自己的 corsproxy 版本。其实很简单。我已将其作为要点发布在 github 上。以下是源代码要点: https://gist.github.com/jianwu/8e76eaec95d9b1300c59596fbfc21b10
它是纯 nodejs 代码,没有任何额外的依赖项 您可以在http和https模式下运行(通过传递https端口 命令行中的数字),要运行 https,您需要生成证书和 密钥并将它们放在 webroot 目录中。 它也可以作为静态文件服务器 它也支持飞行前的 OPTION 请求。启动 CORSProxy 服务器(http 端口 8080): 节点 static_server.js 8080
访问代理: http://host:8080/http://www.somesite.com
【讨论】:
如果你要达到那个程度,你总是可以在本地或远程托管一个 Web 服务器,从你想要的网页中提取内容,然后在上面设置正确的 CORS 标头。 我之前也想过这条路线。但这需要一些编码,特别是在我的情况下,我需要调用来自不同域的几个服务。所以我必须将不同的 URL 模式映射到不同的域。这正是 corsproxy 为我们所做的。而且效果很好。 不正确.. 接受的答案中提到的方式对我有用.. 正如它所提到的,Chrome 49 及更高版本的命令'chrome.exe --disable-web-security --user-data-dir'为我工作.. Chromium 53,--disable-web-security --user-data-dir 对我不起作用 在 53+ 中,您需要实际提供一个与普通目录不同的唯一用户数据目录。这会为不安全的环境创建一个新的配置文件。 --user-data-dir 需要设置为等于某个值,例如上面的 Olas 答案。如果您真的愿意,您可以将其设置为与您实际的普通用户配置文件文件夹相同,但强烈建议不要这样做,因为如果您在该模式下开始正常浏览,它会使您的正常配置文件容易受到意外攻击。【参考方案9】:在 Mac 终端上试试这个命令-
open -n -a "Google Chrome" --args --user-data-dir=/tmp/temp_chrome_user_data_dir http://localhost:8100/ --disable-web-security
它会打开另一个禁用安全性的 chrome 实例,并且不再存在 CORS 问题。此外,您不再需要关闭其他 chrome 实例。将 localhost URL 更改为您的 URL。
【讨论】:
上面的大多数命令行答案对我在 macOS 上没有任何改进。然而这篇 alfilatov.com/posts/run-chrome-without-cors 和命令行 open 对我有用。它与上面的命令相同,因此投票赞成。【参考方案10】:对于 Windows...在您的桌面上创建一个 Chrome 快捷方式。 右键单击 > 属性 > 快捷方式 编辑“目标”路径:
"C:\Program Files\Google\Chrome\Application\chrome.exe" --args --disable-web-security
(将“C:....\chrome.exe”更改为您的 chrome 所在的位置)。
等等 :)
【讨论】:
截至今天 08/27/20013 它对我有用,允许我在自己的本地主机上执行 Ajax。 在 Canary 版本 53 中得到“您正在使用不受支持的命令行标签:--disable-web-security” @khoailang 你仍然可以使用这个开关。该警告是谷歌对不安全战争的一部分(一件好事)。此外,从 55+ 版本开始,您还需要使用 --user-data-dir=,因此 Google 不希望您将不安全的规则与您的普通配置文件混为一谈。 谢谢,我忘记了我的 Chrome 不在路径中,这意味着我必须将它定向到它的文件夹。【参考方案11】:我发现最好的方法是在 Windows 桌面上复制 Chrome 或 Chrome Canary 快捷方式。将此快捷方式重命名为“NO CORS”,然后编辑该快捷方式的属性。
在目标中将--disable-web-security --user-data-dir="D:/Chrome"
添加到目标路径的末尾。
你的目标应该是这样的:
更新:添加了新标志。
"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --disable-web-security --user-data-dir="D:/Chrome"
【讨论】:
这只是给我 404 而不是飞行前错误 404 错误是与服务器相关的错误,而不是 Google Chrome 错误。 @etoxin 这个答案在最新版本的 chrome 中不再有效。您必须添加 --disable-web-security --user-data-dir="D:/Chrome"【参考方案12】:不要这样做! You're opening your accounts to attacks。执行此操作后,任何第 3 方网站都可以开始向其他网站(即您登录的网站)发出请求。
改为运行本地服务器。就像打开 shell/终端/命令行并输入一样简单
cd path/to/files
python -m SimpleHTTPServer
然后将浏览器指向
http://localhost:8000
如果你觉得太慢了consider this solution
更新
不赞成这个答案的人应该去这里和downvote this one too 保持一致。不知道为什么我的答案被如此低估,而与here 相同的答案是票数最高的答案。
您正在让自己受到攻击。您通过 npm 远程或本地包含在您网站上的每个第三方脚本现在都可以上传您的数据或窃取您的凭据。你正在做一些你不需要做的事情。建议的解决方案并不难,需要 30 秒,不会让你打开攻击。当更好的事情如此简单时,你为什么要选择让自己变得脆弱?
告诉人们禁用安全功能就像告诉你的朋友让他们的前门没有上锁和/或在门垫下面放一把钥匙。当然,几率可能很低,但如果他们真的被盗,没有强行进入的证据,他们可能很难获得保险。同样,如果您禁用安全性,您只是在执行禁用 安全性。当您可以在不禁用安全性的情况下如此简单地解决问题时,这样做是不负责任的。如果您不能因为某些公司禁用安全性而被解雇,我会感到惊讶。
【讨论】:
这不会打开“你的机器”受到攻击。恶意 javascript 代码无法在客户端机器本身上做很多事情。但是,您将允许恶意 JavaScript 代码潜在地操纵您在其他网站(facebook/administrations/banks/...)上的帐户。这当然不会减少危险,但完全不同。 Or any 3rdparty library you're including in your local page to upload files from your harddrive to remote servers. 不过,用户可能需要这样做。问题不在于运行服务器。问题是在将 CORS 放到验收/生产服务器之前对其进行测试,在这种情况下不需要进行此更改。修改hosts文件也不行。 更像:OP:“我了解风险,但我仍然想这样做。我是成年人。” @you:“在任何情况下你都不能” @gman 否决。因为隔壁没有医院。医院不可用。【参考方案13】:对于 Selenium Webdriver,在这种情况下,您可以让 selenium 使用适当的参数(或“开关”)启动 Chrome。
@driver = Selenium::WebDriver.for(:Chrome,
:detach => false,
:switches => ["--disable-web-security"]
)
【讨论】:
这是禁用网络安全的两个前面的破折号。它是我的浏览器,它让它们看起来像一个 looong dash。 我写了一篇关于chrome without cors的小帖子【参考方案14】:您可以使用这个名为“Allow-Control-Allow-Origin: *”的 chrome 插件......它让它变得非常简单并且工作得很好。 check it here: *
【讨论】:
它将“evil.com”网站设置为来源,看起来很可疑。 根据此评论的日期不再起作用。建议只使用标志路线。【参考方案15】:-
创建一个新的快捷方式:
-
粘贴以下路径:
"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" "C:\Program Files\Google\Chrome\Application\chrome.exe" --disable-web-security --user-data-dir="c:\temp\chrome"
-
命名:
Unsafe Chrome.exe
现在您在桌面上拥有了一个不安全的 Google Chrome 版本,可以使用它来调试前端应用程序,而不会出现任何 CORS 问题。
【讨论】:
【参考方案16】:你可以简单地使用这个 chrome 扩展 Allow-Control-Allow-Origin
只需单击扩展的图标即可根据需要打开或关闭跨资源共享
【讨论】:
链接已失效。 不是。是的,它正在工作。但是我们在这里,因为我们现在知道命令的含义,所以在此之前使用上述解决方案! @Jánosi-BorsosRóbert 谁是您的“我们”,您对命令含义的了解如何将您带到这里?仅供参考:您的命令不准确,我没有服从;) 确实是@Superole。我的意思是我认为使用命令比安装扩展更好。 它不适用于 iframe。它仅禁用部分 CORS【参考方案17】:如果您在 Linux 上使用 Google Chrome,则以下命令有效。
google-chrome --disable-web-security
【讨论】:
【参考方案18】:这个 Chrome 插件适用于我: Allow-Control-Allow-Origin: * - Chrome Web Store
【讨论】:
这个插件破坏了我的浏览器并开始破坏所有 XHR 的东西。谨慎使用。 该插件已从 chrome 商店中移除【参考方案19】:对于 OSX,从终端运行以下命令:
open -na Google\ Chrome --args --disable-web-security --user-data-dir=$HOME/profile-folder-name
这将启动一个新的 Google Chrome 实例,并在顶部显示警告。
注意:如果您使用 --user-data-dir
,则 chrome 会与您的用户数据文件夹断开连接(并从您的所有站点中注销)——即使您在没有任何参数的情况下再次运行它。要回滚它,您需要以上述方式打开但没有该参数。
【讨论】:
这是迄今为止对我有用的唯一答案【参考方案20】:仅适用于 MAC 用户
open -n -a /Applications/Google\ Chrome.app --args --user-data-dir="/tmp/someFolderName" --disable-web-security
【讨论】:
如何恢复此更改@saurab @MohasinAli 关闭所有 chrome 窗口,然后像往常一样运行它。它只影响您使用此参数运行的实例。如果您在没有任何参数的情况下再次运行它,则不会应用此更改。【参考方案21】:在 Linux-Ubuntu 上,要同时运行正常会话和不安全会话,请运行以下命令:
google-chrome --user-data-dir=/tmp --disable-web-security
【讨论】:
【参考方案22】:按照 Ola Karlsson 的回答,确实最好的方法是在不同的会话中打开不安全的 Chrome。这样您就无需担心关闭所有当前打开的标签页,还可以继续使用原始 Chrome 会话安全地上网。
这些批处理文件应该只适用于 Windows。
把它放在Chrome_CORS.bat file 中方便使用
start "" "c:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --user-data-dir="c:/_chrome_dev" --disable-web-security
这个适用于 Chrome Canary。 Canary_CORS.bat
start "" "c:\Users\%USERNAME%\AppData\Local\Google\Chrome SxS\Application\chrome.exe" --user-data-dir="c:/_canary_dev" --disable-web-security
【讨论】:
这是对批处理文件的毫无意义的使用。捷径会更好。只需将第一对引号之后的所有内容放入快捷方式目标即可。 这并不重要。然而,您可以批量执行更多操作,例如在关闭浏览器后删除 user-data-dir。 没错,在启动之外添加行为会很有用,但对于大多数需要这个的人来说,拥有一个持久的用户目录是有帮助的(例如安装了扩展)【参考方案23】:chromium-browser --disable-web-security --user-data-dir=~/ChromeUserData/
【讨论】:
【参考方案24】:在 Windows 10 上,以下将起作用。
<<path>>\chrome.exe --allow-file-access-from-files --allow-file-access --allow-cross-origin-auth-prompt
【讨论】:
我很惊讶你的回答被否决了。使用最新的 Chrome 版本处理本地文件对我来说效果很好。 @CHANist:这也许就是 OP 说“在 Windows 10 上”...?【参考方案25】:Mac 用户:
open -a "Google Chrome" --args --disable-web-security --user-data-dir
在 Chrome 48 之前,您可以使用:
open -a "Google Chrome" --args --disable-web-security
【讨论】:
谢谢。这适用于包含新 CORB 安全策略的最新 Chrome 73。【参考方案26】:这是一个不断变化的目标......今天我需要添加另一个标志来让它工作:
--disable-site-isolation-trials
操作系统:
open /Applications/Google\ Chrome.app --args --user-data-dir="/var/tmp/Chrome_dev_2" --disable-web-security --disable-site-isolation-trials
【讨论】:
【参考方案27】:有一个名为 CORS Toggle 的 Chrome 扩展程序。
Click here to access it and add it to Chrome.
添加后,将其切换到on位置以允许跨域请求。
【讨论】:
链接已失效。【参考方案28】:在 Ubuntu 中使用以下命令启动 chrome(禁用同源策略并以分离模式打开 chrome):
nohup google-chrome --disable-web-security --user-data-dir='/tmp' &
【讨论】:
【参考方案29】:对于 Windows:
(使用 windows 8.1,chrome 44.0)
首先,关闭谷歌浏览器。
然后,打开命令提示符并转到“chrome.exe”所在的文件夹。
( for me: 'chrome.exe' is here "C:\Program Files (x86)\Google\Chrome\Application".
所以我输入:
cd C:\Program Files (x86)\Google\Chrome\Application
)
现在输入:chrome.exe --disable-web-security
将打开一个新的 chrome 窗口。
【讨论】:
【参考方案30】:在 Windows PC 上,使用旧版本的 Chrome,该命令将适用于所有人。 我将我的 Chrome 降级到 26 版本并且它工作正常。
【讨论】:
你不需要旧版本的 chrome 使用这个完整的命令 --disable-web-security --user-data-dir="D:/Chrome"以上是关于在 Chrome 中禁用同源策略的主要内容,如果未能解决你的问题,请参考以下文章