私が持っている場合:
var test = {toString: function(){alert("evil code"); return "test";}};
どうすればtest
文字列に変換できますか?文字列以外を許可したいので、呼び出しもチェックtest.toString()
も使用せずに。typeof x == "string"
注:これは、コンテンツページのjsスコープからのオブジェクトを処理するFF拡張機能用です。
私が持っている場合:
var test = {toString: function(){alert("evil code"); return "test";}};
どうすればtest
文字列に変換できますか?文字列以外を許可したいので、呼び出しもチェックtest.toString()
も使用せずに。typeof x == "string"
注:これは、コンテンツページのjsスコープからのオブジェクトを処理するFF拡張機能用です。
JavaScriptを使用すると、スクリプトにアクセスできるほとんどすべてのオブジェクト(Object.prototype
それ自体を含む)のプロパティを変更できます。つまり、オブジェクトは、説明した方法で「悪意のあるコード」に対して脆弱です。
安全性が保証されているのはプリミティブだけなので、「邪悪なコード」が実行されないようにする唯一の方法は、次のようなことを行うことです。
function safeToString(x) {
switch (typeof x) {
case 'object':
return 'object';
case 'function':
return 'function';
default:
return x + '';
}
}
残念ながら、@ Matthew Flaschenの(現在受け入れられている)回答はSymbol
、ES6/ES2015のクラス では機能しません。
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()
と、かなり良い結果が得られます。
ここでは解析されませ(toString: function(){alert("evil code"); return "test";})
ん。構文エラーがスローされます。{}
の代わりに使いたかったと思います()
。
通常、空の文字列とプラス演算子を使用してキャストを実行できます。
""+test;
""+2; // "2"
""+4.5 // "4.5"
""+[1, 2, 3] // "1,2,3"
""+{} // '[object Object]'
しかし、ここでは、オブジェクトを安全に変換する実際の方法はありません。
delete test.toString
オーバーライドされたメソッドを取り除くために使用できます。その後、toString
を返す通常のメソッドにフォールバックします'[object Object]'
。toString
メソッド自体を。を介して文字列に変換することもできますtest.toString.toString()
。
"function () { alert("evil code"); return "test"; }"
ここで何をしたいかはあなた次第です。
1つのオプションは次のとおりです。
Object.prototype.toString.call(test)
これは与える:
"[object Object]"
テストの場合。基本的には、タイプ情報を提供するだけです。しかし、正確なシナリオはここにあるのだろうか。邪悪なオブジェクトはどのようにページに読み込まれますか?彼らがページ上で任意のコードを実行できる場合、あなたは基本的に運が悪いです。とりわけ、再定義することが可能Object.prototype.toString
です。
ケースのみをチェックして、このようなコンストラクターundefined
を使用して変換できます。String
let a = [1,2,3]
String(a)
例外的なケース:String(undefined) --> "undefined"
それが役に立てば幸い
lodashtoStringメソッドを使用できます。
_.toString(null);
// => ''
_.toString(-0);
// => '-0'
_.toString([1, 2, 3]);
// => '1,2,3'