首页 > 解决方案 > 如何将标识符替换为相关值以进行场外评估?

问题描述

我想要一个标签:

<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 代码中。但我不知道他们所做的是否正是我正在做的,或者他们是否以更好的方式做到了。建议?

标签: javascriptfunctiongoogle-cloud-platformgoogle-cloud-functions

解决方案


你的代码:

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+");";

推荐阅读