javascript - 如何将标识符替换为相关值以进行场外评估?
问题描述
我想要一个标签:
<script src="https://mysource.com/script?foo=bar"></script>
https://mysource.com/scriptbar
是一个云函数端点,它返回一个应该在浏览器中运行的脚本,使用foo
. 该脚本无法评估函数并简单地发回结果,因为它的预期行为会导致副作用,例如向窗口对象添加内容。
我能够通过执行以下操作来做到这一点:
//prevents code injection like eval("evilcode")
function sanitize(){}
const foo = sanitize(req.query.foo);
const myFunc = ()=>{... <uses foo somewhere> ... <causes side effects> ...};
let strFunction = myFunc.toString();
strFunction = strFunction.replace("foo", foo);
const script = "("+strFunction+")();";
res.status(200).send(script);
但我不禁想知道是否有更好的方法来做到这一点。谷歌在他们的 gtag 脚本中做了我想做的事情。如果您访问https://www.googletagmanager.com/gtag/js?id=AW-950577603和 ctrl+f AW-950577603,您会看到查询的 id (AW-950577603) 出现在 javascript 代码中。但我不知道他们所做的是否正是我正在做的,或者他们是否以更好的方式做到了。建议?
解决方案
你的代码:
const myFunc = ()=>{... <uses foo somewhere> ... <causes side effects> ...};
let strFunction = myFunc.toString();
strFunction = strFunction.replace("foo", foo);
const script = "("+strFunction+")();";
foo
您可以创建foo
一个参数,而不是 text-replacing :
const myFunc = (foo)=>{... <uses foo somewhere> ... <causes side effects> ...};
let strFunction = myFunc.toString();
const script = "("+strFunction+")("+foo+");";
推荐阅读
- mysql - MySQL - 比较两个表并将它们求和
- sql - SSMS 中 NOT IN 的替代方案
- amp-html - 设置标题 AMP-Redirect-To 后,目标为 _blank 的 amp-form 应重定向?
- r - 如何从 R 中的哈希表中通过其值检索键的名称
- angular - 角度如果在switchmap内部检查是否不为空
- linux - 验证文件字符的字符串,包括空格
- python - 如何在列表中查找相似数字的位置
- javascript - 谷歌 VR 服务 Aframe
- laravel-5 - 如何从 laravel 中相关模型的单个字段中获取数组?
- nativescript-vue - 使用 Nativescript Vue 拖放