如何在JavaScript中安全地将任何内容转换为String

时间:2010-11-30 04:28:11

标签: javascript security firefox-addon gecko

如果我有:

var test = {toString: function(){alert("evil code"); return "test";}};

如何将test转换为字符串?没有调用test.toString()而没有使用typeof x == "string"检查,因为我想允许非字符串。

注意:这是针对FF扩展处理来自内容页面的js范围的对象。

6 个答案:

答案 0 :(得分:6)

你的(toString: function(){alert("evil code"); return "test";})甚至没有在这里被解析,它会引发语法错误。我想您想使用{}代替()

通常你可以使用空字符串和plus运算符来执行强制转换:

""+test;
""+2; // "2"
""+4.5 // "4.5"
""+[1, 2, 3] // "1,2,3"
""+{} // '[object Object]'

但是在这里,没有真正的方法可以安全地转换对象。

您可以使用delete test.toString删除被覆盖的方法,之后它将回退到返回toString的正常'[object Object]'方法。您还可以通过toStringtest.toString.toString()方法本身转换为字符串。

"function () { alert("evil code"); return "test"; }"

这取决于你在这里想做什么。

答案 1 :(得分:5)

JavaScript允许您修改脚本可访问的几乎任何对象的属性,包括Object.prototype本身,这意味着任何对象都容易受到“恶意代码”的攻击你解释过。

只保证基元是安全的,因此确保永远不会执行“恶意代码”的唯一方法是执行以下操作:

function safeToString(x) {
  switch (typeof x) {
    case 'object':
      return 'object';
    case 'function':
      return 'function';
    default:
      return x + '';
  }
}

答案 2 :(得分:4)

一个选项是:

Object.prototype.toString.call(test)

这给出了:

"[object Object]"

在测试的情况下。基本上,它只提供类型信息。但是,我想知道具体情况是什么。如何将恶意对象加载到页面中?如果他们可以在页面上执行任意代码,那么你基本上就不走运了。除此之外,还可以重新定义Object.prototype.toString

答案 3 :(得分:2)

可悲的是,@ Matthew Flaschen(目前接受的)答案不适用于ES6 / ES2015的Symbol课程:

console.log("" + Symbol("foo"));
// results in an exception: 
//   `Uncaught TypeError: Cannot convert a Symbol value to a string` 
// (at least in Chrome as of this writing).

https://jsfiddle.net/L8adq9y4/

(我不知道为什么,因为Symbol有一个非常好的toString()方法:)

console.log(Symbol("foo").toString());

https://jsfiddle.net/v1rqfhru/

虽然有一个解决方案:String()函数似乎能够将任何值(至少从我尝试过的值)转换为String。如果它存在,它甚至会调用toString()

console.log(String("A String"));
console.log(String(undefined));
console.log(String(null));
console.log(String({value: "An arbitrary object"}));
console.log(String({toString: function(){return "An object with a toString() method";}}));
console.log(String(function(){return "An arbitrary function"}));

https://jsfiddle.net/6uc83tsc/

所以,将你喜欢的任何内容传递给String(),你就会得到相当不错的结果。

答案 4 :(得分:0)

您可以使用lodash toString方法。

zip(*exampleList)

Link to documentation

答案 5 :(得分:0)

您只能检查undefined个案例并将其转换为使用String构造函数 这样。

let a = [1,2,3]

String(a)

例外情况:String(undefined) --> "undefined"

希望有帮助