许多开发人员认为eval()应该避免使用JavaScript的方法.从设计角度来看,这个想法很有意义.当更简单,更好的选项可用时,它通常被用作丑陋的解决方法.
但是,我不了解安全漏洞的担忧.当然,运行eval()使黑客能够运行您可以运行的任何JavaScript代码.
但他们不能这样做吗?至少在Chrome中,开发人员工具允许最终用户运行自己的JavaScript.如何eval()比开发人员工具更危险?
我按照这篇文章将 CSP 添加到我现有的 React 应用程序中。我在那里完成了“使用内联脚本或样式”中编写的所有步骤,这是我的config-overrides.js文件:
const { override } = require('customize-cra');
const cspHtmlWebpackPlugin = require('csp-html-webpack-plugin');
const cspConfigPolicy = {
'default-src': "'none'",
'base-uri': "'self'",
'object-src': "'none'",
'script-src': ["'self'"],
'style-src': ["'self'"],
'img-src': ["'self'"],
};
function addCspHtmlWebpackPlugin(config) {
if (process.env.NODE_ENV === 'production') {
config.plugins.push(new cspHtmlWebpackPlugin(cspConfigPolicy));
}
return config;
}
module.exports = {
webpack: override(addCspHtmlWebpackPlugin),
};
Run Code Online (Sandbox Code Playgroud)
为了测试它是否有效,我构建了应用程序npm run build(因为 CSP 刚刚添加到生产版本中),但在此之前,为了测试它是否有效,我将 jquery 添加到了里面的脚本中index.html:
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
Run Code Online (Sandbox Code Playgroud)
不幸的是,jquery 被添加到构建中,CSP 没有阻止它。
难道我做错了什么?还是我误解了内容安全策略?