5 개의 기호 만있는 JSF ** k?


47

이것은 도전이 아니라 질문입니다.

프로그래밍 퍼즐 해결 또는 특정 유형의 도전 과제와 관련된 비 도전 질문도 주제입니다.

이제 질문에 :

5 자만으로 JavaScript 코드를 작성할 수 있습니까? JSFuck은 이미 6 개의 기호 로이 작업을 수행 !+[]()하지만 !문자가 필요한지 궁금 합니다.

JSFuck은 문자열로 캐스팅 (빈 배열 추가), 숫자로 캐스팅 (+ 앞에 쓰기) 및 무효화로 부울 캐스팅의 조합으로 작동합니다. 예를 들면 다음과 같습니다.

[]        \\ Empty array
+[]       \\ Cast to number -> 0
!+[]      \\ Negate -> true
!+[]+[]   \\ Cast to string -> "true"

이 문자열에서 숫자 안에 대괄호를 사용하여 모든 글자를 추출 할 수 있으며 여러 번 함께 true를 추가하여 숫자를 만들 수 있습니다.

이와 같이 많은 문자를 찾을 수 있으며 문자열에 연결할 수 있습니다. 만들 수있는 가장 중요한 문자열 은 모든 함수에서 "constructor"가져 오는 Function데 사용할 수 있고이 객체를 사용하여 문자열을 JavaScript로 실행할 수 있기 때문입니다.

[]["find"]                          \\ the function Array.prototype.find
[]["find"]["constructor"]           \\ the Function object
[]["find"]["constructor"](string)() \\ same as eval(string)

보시다시피 !여기에 2 가지 용도가 있습니다.

  • 문자열에서 문자를 선택하기 위해 숫자 만들기
  • 부울으로 변환하면 얻을 수 "true""false".

이 2 중 첫 번째는 ++직접 on이 아닌 인크 리 멘탈을 사용하여 수행 0할 수 있지만 배열 내부의 요소에서 사용할 수 있습니다.

+[]          \\ 0
[+[]]        \\ [0]
[+[]][+[]]   \\ [0][0] -> 0
++[+[]][+[]] \\ ++[0][0]-> 1
++[[]][+[]]  \\ also works because ++ casts to number

따라서 모든 번호는없이 만들 수 있습니다 !.

두 번째는 더 어렵다. 의 중요성 "true""false"문자 낳는다 "r""s"모두에 표시 "constructor". 나는 이미 모든 다른 문자를 발견 "constructor"의 수단으로 "undefined", "Infinity", "NaN"문자열에 기능을 캐스트.

따라서 궁극적 인 질문 : (어떻게) ?를 사용하여 부울 또는 문자 "r""s"JavaScript 를 만들 수 +[]()있습니까?

편지 "l"가 도움이 될 수도 있습니다. 그것은 형태로 얻을 수 null있지만 그 5 개의 기호로 그 가치를 얻을 수 없었습니다. 예를 들어 이미 다음과 "s"같은 경우 부울을 얻는 데 사용할 수 있습니다 .

[]["includes"]()       \\ false
[+[]]["includes"](+[]) \\ true

이 서한 "l""k"함께 "r"다음에 액세스 할 수 있습니다 .

([]+[])["link"]() \\ "<a href="undefined"></a>"

부울 null또는 문자 를 얻는 방법 r s l k은 매우 유용합니다!

우리가 가진 라이브러리 :

Array.prototype.find : [] [(([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])]) + (([[[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + ( ++ [[]] [+ []])]) + (([[[]] + []) [++ [[]] [+ []]]) + (([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []])])]

무한대 : + ((++ [[]] [+ []] + []) + (([[[] [[]] + []) [(++ [[]] [+ []]) + (+ + [[]] [+ []]) + (++ [[]] [+ []])]) + (++ [[]] [+ []] + []) + (+ []) + (+ []) + (+ []))

NaN : + [] [[]]

찾으시는 주소가 없습니다: [][[]]

0 : + []

1 : ++ [[]] [+ []]

2 : (++ [[]] [+ []]) + (++ [[]] [+ []])

3 : (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])

4 : (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[] ] [+ []])

5 : (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[] ] [+ []]) + (++ [[]] [+ []])

6 : (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[] ] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])

7 : (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[] ] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])

8 : (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[] ] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])

9 : (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[] ] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])

a : (+ [] [[]] + []) [++ [[]] [+ []]]

c : ([] [(([[[[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])]) + (([[[]] + []) [(++ [[]] [+ [ ]]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [ []] [+ []])]) + (([[[[]] + []) [++ [[]] [+ []]]) + (([[[]] + [] ) [(++ [[]] [+ []]) + (++ [[]] [+ []])])] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])]

d : ([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []])]

e : ([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [ + []])]

f : ([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [ + []]) + (++ [[]] [+ []])]

i : ([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [ + []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])]

n : ([] [[]] + []) [++ [[]] [+ []]]

o : ([] [(([[[[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])]) + (([[[]] + []) [(++ [[]] [+ [ ]]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [ []] [+ []])]) + (([[[[]] + []) [++ [[]] [+ []]]) + (([[[]] + [] ) [(++ [[]] [+ []]) + (++ [[]] [+ []])])] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])]

t : (+ ((++ [[]] [+ []] + []) + (([[[] [[]] + []) [(++ [[]] [+ []]) + ( ++ [[]] [+ []]) + (++ [[]] [+ []])]) + (++ [[]] [+ []] + []) + (+ [] ) + (+ []) + (+ [])) + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ [] ])]

u : ([] [[]] + []) [+ []]

v : ([] [(([[[[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])]) + (([[[]] + []) [(++ [[]] [+ [ ]]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [ []] [+ []])]) + (([[[[]] + []) [++ [[]] [+ []]]) + (([[[]] + [] ) [(++ [[]] [+ []]) + (++ [[]] [+ []])])] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + [] + ((++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]))]

y : (+ ((++ [[]] [+ []] + []) + (([[[] [[]] + []) [(++ [[]] [+ []])) + ( ++ [[]] [+ []]) + (++ [[]] [+ []])]) + (++ [[]] [+ []] + []) + (+ [] ) + (+ []) + (+ [])) + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ [] ]) + (++ [[]] [+ []])]

I : (+ ((++ [[]] [+ []] + []) + (([[[] [[]] + []) [(++ [[]] [+ []])) + ( ++ [[]] [+ []]) + (++ [[]] [+ []])]) + (++ [[]] [+ []] + []) + (+ [] ) + (+ []) + (+ [])) + []) [+ []]

N : (+ [] [[]] + []) [+ []]

"": ([] [(([[[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (+ + [[]] [+ []]) + (++ [[]] [+ []])]) + (([[[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])]) + (([[[]] + []) [++ [[]] [+ []]]) + (([[[]] + [ ]) [(++ [[]] [+ []]) + (++ [[]] [+ []])])] + []) [+ (++ [[]] [+ [] ] + [] + ((++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (+ + [[]] [+ []]) + (++ [[]] [+ []])))]

(: ([] [(([[[[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])]) + (([[[]] + []) [(++ [[]] [+ [ ]]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [ []] [+ []])]) + (([[[[]] + []) [++ [[]] [+ []]]) + (([[[]] + [] ) [(++ [[]] [+ []]) + (++ [[]] [+ []])])] + []) [+ (++ [[]] [+ []] + [] + ((++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])))

) : ([] [(([[[[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])]) + (([[[]] + []) [(++ [[]] [+ [ ]]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [ []] [+ []])]) + (([[[[]] + []) [++ [[]] [+ []]]) + (([[[]] + [] ) [(++ [[]] [+ []]) + (++ [[]] [+ []])])] + []) [+ (++ [[]] [+ []] + [] + ((++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])))]

{: ([] [(([[[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])]) + (([[[]] + []) [(++ [[]] [+ [ ]]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [ []] [+ []])]) + (([[[[]] + []) [++ [[]] [+ []]]) + (([[[]] + [] ) [(++ [[]] [+ []]) + (++ [[]] [+ []])])] + []) [+ (++ [[]] [+ []] + [] + ((++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])))]

} : ([] [(([[[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])]) + (([[[]] + []) [(++ [[]] [+ [ ]]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [ []] [+ []])]) + (([[[[]] + []) [++ [[]] [+ []]]) + (([[[]] + [] ) [(++ [[]] [+ []]) + (++ [[]] [+ []])])] + []) [+ ((++ [[]] [+ [] ]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + [] + ((++ [[]] [+ []])) + ( ++ [[]] [+ []])))])

. : (+ (++ [[]] [+ []] + [] + (++ [[]] [+ []]) + ([] [[]] + []) [(++ [ []] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])] + (++ [[]] [+ [] ] + [] + (+ []) + (+ []))) + []) [++ [[]] [+ []]]

, :[[]] [([] [(([[[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])]) + (([[[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + ( ++ [[]] [+ []])]) + (([[[]] + []) [++ [[]] [+ []]]) + (([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []])]]] []) [(++ [[]] [+ [ ]]) + (++ [[]] [+ []]) + (++ [[]] [+ []])] + ([] [(([] [[]] + []) [ (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [ + []])]) + (([[[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + ( ++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])]) + (([] [[] ] + []) [++ [[]] [+ []]]) + (([[[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []])])] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [ []] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []] )] + ([] [[]] + []) [++ [[]] [+ []]] + ([] [(([] [[]] + []) [(++ [[ ]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) ]) + (([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[] ] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])]) + (([[[]] + []) [++ [[]] [+ []]]) + (([[[]] + []) [(++ [[]] [+ []]) + (++ [[]] [ + []])])] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])] + (+ [] [[]] + []) [++ [[]] [+ []]] + (+ ((++ [[]] [+ []] + []) + (([] [[]] + []) [(++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []])]) + ( ++ [[]] [+ []] + []) + (+ []) + (+ []) + (+ [])) + []) [(++ [[]] [+ [] ]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[]] [+ []]) + (++ [[ ]] [+ []]) + (++ [[]] [+ []])]] ([[]]) + []

이것은 codegolf.stackexchange.com/q/11690/194 와 매우 밀접한 관련이 있으며 해당 질문에 JS 답변이 있으면 마감하기로 결정했을 것입니다. 이 질문에 대한 답변은 이전 질문에 대한 답변으로 직접 변환 될 가능성이 있지만 그 차이로 인해 일방적으로 닫고 싶지 않은 경계선이 생깁니다.
Peter Taylor

29
아주 좋은 질문입니다. 난해한 프로그래밍과 비 전통적인 계산 모델에 대해 절대적으로 찬성 하지만 일부 사람들은 투표를 준비합니다. 현재 사람들이 메타에 동의하는 범위에 맞지 않기 때문입니다. 그래도 그러한 질문에 대한 선례를 설정하기를 바랍니다. :)
Martin Ender

1
의견은 긴 토론을위한 것이 아닙니다. 이 대화는 채팅 으로 이동 되었습니다 .
Alex A.

4
이와 같은 질문은 질문에 현상금을주는 기능이 있기를 바랍니다.
xnor

1
나는 eval2453 문자를 window허용했다.
CalculatorFeline

답변:


23

브레인 스토밍 후에 는 최신 브라우저에서 최소한 이렇게 할 수있는 방법이없는 것 같습니다.

계속 진행하기 전에 특정 도메인에서 옵션을 모두 사용한 이유에 대한 몇 가지 추론을 추가하여 전체 프로세스를 요약하려고합니다. 그런 다음 모든 종류의 잊어 버린 JavaScript 구문과 같은 놀라운 새로운 통찰력을 제거하면 나머지 글자를 얻을 수있는 방법이 없다는 것이 분명합니다.

리터럴

유일한 즉시 당신이 할 수 리터럴은 +()[]중첩 된 빈 배열 인 [], [[]], [[[]]], 등 거기에서, 우리는 사용하여 값을 캐스팅 시작할 수 있습니다 +:

  • +[]Jens의 트릭은을 사용하여 임의의 양의 정수로 확장됩니다 ++.

  • []+[]입니다 "". 사실, 일반적으로 []+x문자열 표현을 얻습니다 x.

[]의 다음 사용은 색인 작성입니다. 범위를 벗어난 객체를 인덱싱하면 ( [][[]]) 얻을 수 있습니다 undefined. 문자열로 캐스팅하고 결과를 인덱싱하면 문자가 표시됩니다 d e f i n u. 처음 사용하는 정수로 캐스팅 +을 얻을 NaN글자가있는, a N따릅니다.

++정수가 아닌 값에 트릭을 사용하면 지금까지 도달 NaN했거나 오류가 발생했습니다. 또한 우리가 만들 수있는 객체 중 어느 것도 호출 할 수 없으므로 아직 ()그룹화를 제외하고는 도움이되지 않습니다.

소매업에서 남은 요령은 캐스팅과 색인입니다. 따라서 질문은 다음 0123456789adefinuN중 하나 의 문자 를 사용하여 만들 수있는 문자열입니다.

  • 새로운 문자열을 얻기 위해 정수로 라운드 캐스트 할 수있는 숫자 리터럴이거나
  • 도달 할 수있는 객체의 속성 이름은 무엇입니까?

숫자 리터럴

두 번째 옵션의 예로, 문자열 "1e1000"을 만든 다음 Infinity에서 가져 와서 문자열로 다시+"1e1000" 캐스팅 하면 문자 와가 나타납니다 .yI

또한 우리는을 추출 하고 , "11e100"을 숫자로 캐스트하고 문자열로 되돌릴 수 있습니다."1.1e+101".+

그것을 사용하여 ., 우리는 문자열을 만들고 ".0000001", 다시 숫자로 캐스팅하고, 얻기 위해 "1e-7", 우리를 이길 수 -있습니다.

기본적으로 모든 수레가 당신을 얻을 것입니다 : Infinityand 이외의 더 흥미로운 값 NaN은 없으며 일반적인 문자열 표현 이외의 문자는 더 이상 사용되지 않습니다 -+.0123456789e.

속성

그래서 우리는 글자가 -+.0123456789adefinuyIN있습니다. 어떤 속성에 도달 할 수 있습니까? JavaScript를 물어 보자.

>>> R = /^[-+.0123456789adefinuyIN]+$/
>>> [Array, Object, String, Number].reduce((h, f) => {
        h[f.name] = Object.getOwnPropertyNames(f.prototype).filter(x => x.match(R));
        return h }, {})

{ Array: [ 'find' ], Object: [], String: [], Number: [] }

[].find, 옌스는 이미 발견한다. 그것을 문자열로 던져서 모든 글자를 거둔 다음 다시 시도해 봅시다. 문자열 표현은 브라우저마다 약간 다릅니다. Chrome 및 Edge에서 "function find() { [native code] }"포함 acdefinotuv()[]{}및 공백; 우리의 전체 알파벳은 이제 +-.()[]{}0123456789INacdefinotuvy입니다. Firefox에는 공백과 줄 바꾸기가 더 있지만 문자는 동일합니다.

검색을 반복합니다 :

>>> R = /^[+-.()\[\]{}0123456789INacdefinotuvy]+$/
>>> [Array, Object, String, Number, Function].reduce((h, f) => {
        h[f.name] = Object.getOwnPropertyNames(f.prototype).filter(x => x.match(R));
        return h }, {})

{ Array: [ 'concat', 'find' ],
  Object: [],
  String: [ 'concat' ],
  Number: [],
  Function: [] }

String.prototype.concat더 이상 사용되지 않습니다. +이미 수행 할 수있는 작업을 정확하게 수행합니다. 그래서 우리가 가지고 Array.prototype.concatArray.prototype.find. 그들과 함께 무엇을 할 수 있습니까?

기능

concat()처음으로 더 긴 배열을 만들 수 있습니다. [[]].concat([[]])이다 [[], []], 그리고 문자열로 그 주조하는 것은 우리를 얻는다 ",". (이것은 우리가 새로운 속성을 찾는 데 도움이되지 않습니다.) 그러나 .concat값을 수정하지는 않으며 결코 반환 할 수 없습니다 null.

통화 기능 find()중 하나 도움이되지 않습니다 다음 MDN 문서가 말한다

find()배열의 요소가 제공된 테스트 기능을 만족하면 이 메소드는 배열의 값을 리턴합니다. 그렇지 않으면 undefined반환됩니다.

우리는 이미 인덱싱을 사용하여 할 수 있습니다.


그리고 여기에는 다른 곳이 없습니다. 내가 쓴 것을 의심하는 경우 의견에 알려주십시오.


1
혼자 지난 시간에 작업 한 내 개인적인 접근 방식은 모든 가능한 산출 한 null반환 기능 : String.prototype.match, RegExp.exec,와 Array.prototype.includes. 내가 알지 못하는 정규 표현식을 형성하는 이상한 방법이 없다면이 모든 불가능한 형성을 발견하면 가능한 방법이 없다는 결론을 내 렸습니다.
Conor O'Brien

좋은 분석! 이것은 아마도 정답 일지 모르지만 나는 여전히 약간의 트릭을 기대하고 있습니다 ... 아마도 거짓 희망 :)
Jens Renders

잡을 수있는 글자를 얻을 수 있다면 오류의 글자를 얻을 수 있습니까? 그것은 'hwr'입니다.
Rɪᴋᴇʀ

3
현재 할 수없는 문자열 "catch"및 을 구성하더라도 키워드를 키워드로 사용 "throw"하려면 무언가가 필요 eval합니다. 이것이 목표입니다.
Lynn

음수는 -숫자 캐스팅을 사용하여 가능 하지만 유용하지는 않습니다.
CalculatorFeline

15

Lynn의 답변 에서 3 가지 기능 은 그다지 쓸모가 없었습니다. 그러나 ECMAScript 5 의 엄격한 모드 는 내 계획을 자극했습니다.

이전 버전의 JavaScript / ECMAScript에는 문제가 있습니다. 객체없이 메소드를 호출하면 전역 객체 window로 간주됩니다. 그래서 우리는 이것을 할 수 있습니다 :

a = {f:function(){return this}};
a.f();                            // Returns a.
g = a.f;
g();                              // Returns window.
window.g();                       // Also returns window.

최신 브라우저에서는 여전히 그렇습니다. 그러나 기능이 엄격 모드로 정의되지 않은 경우에만 가능합니다. 그리고 모든 기본 제공 기능 (기본 코드 포함)은 엄격 모드 인 것처럼 보입니다. 아직 엄격 모드가없는 구형 브라우저에서는 내장 기능에도 작동합니다.

이전 브라우저를 사용한다고 가정하십시오. 그런 다음 원하는 window경우을 포함하는 무언가를 반환하는 내장 함수를 찾아야합니다 this. 우리가 가진 유일한 선택에는 Array.prototype.concat정확히 그렇게 하는 기능 이 있습니다. 다음과 같이 테스트 할 수 있습니다.

Number.prototype.concat = Array.prototype.concat;
1..concat(2);                     // Returns [1, 2]
concat = Array.prototype.concat;
window.concat(2);                 // Returns [window, 2]
concat(2)                         // TypeError in modern browsers while
                                  //   returning the same thing in older ones.
concat.bind(window)(2)            // A workaround in modern browsers.

따라서 기본적으로 호출 된 객체가 배열인지 여부는 신경 쓰지 않습니다 (그러나 최소한 객체이어야 함). 그렇지 않으면 배열로 래핑합니다.

우리가 가지고 있다면 window, 먼저 문자열을 문자열 [object Window]로 캐스팅 하여 문자열 을 얻을 수 있습니다 . 새로운 캐릭터를 사용하면 다음 두 줄을 각각 사용 하고 사용할 b수 있습니다 .rsconstructor

window["atob"]("cuaa")[0]
window["atob"]("cyaa")[0]

그러나 다른 문제는에서 객체 참조를 제거하는 것 [].concat입니다. [].concat이미 배열을 래핑하고 추출하는 것은 작동하지 않습니다 []["concat"]. 내가 사용할 수있는 유일한 방법 +[]()은 함수에서 반환하는 것입니다. Array.prototype.find그렇게 할 수있는 것처럼 보였습니다.

[[]["concat"]]["find"](x=>1)      // Returns Array.prototype.concat, where x=>1 can
                                  //   be replaced with any always truthy function.

우리는 항상 진실한 기능을 가지고있었습니다. Array.prototype.concat그리고 String.prototype.concat모두 반환 truthy는 객체 인 경우 window. 우리가 후자를 사용한다면, 우리는 사용 가능한 세 가지 기능을 모두 사용했습니다.

그러나 불행히도 Array.prototype.find우리가 사용하는 이전 브라우저에는 존재하지 않습니다. 적어도 나는 작동하는 것을 찾지 못했습니다. 그리고 객체 참조를 제거하는 다른 방법을 찾지 못했습니다.

현대 반환하는 브라우저에서 테스트 할 수 있습니다 전체 코드 rs와, .bind(window)해결 방법 :

[[]["concat"]]["find"](""["concat"].bind(window)).bind(window)()[0]["ato"+([]+[[]["concat"]]["find"](""["concat"].bind(window)).bind(window)()[0])[2]]("cuaa")[0];
[[]["concat"]]["find"](""["concat"].bind(window)).bind(window)()[0]["ato"+([]+[[]["concat"]]["find"](""["concat"].bind(window)).bind(window)()[0])[2]]("cyaa")[0]

멋진 정보. 어떤 브라우저를 사용해 보셨습니까?
Lynn

@Lynn 많지 않습니다. 대부분 Firefox 3.6.0 및 25.0. 나는 읽고 여기여기에find뭔가 작업을 찾는 것은 어려울 정도로 엄격 모드보다 훨씬 나중에왔다. 표준을 따르는 것보다 이전 버전과의 호환성을 선호 할 가능성이 있다고 생각했기 때문에 Edge에 대해 물었습니다. 나는 또한 같은 이유로 Konqueror를 시도했다. 일부 명령 줄 브라우저는 JavaScript를 지원하지도 않습니다.
jimmy23013

Safari 7.1 및 8과 브라우저 스크린 샷 웹 사이트의 전화기에서 임의의 기본 브라우저를 사용해 보았습니다. 지금까지는 작동하지 않습니다.
jimmy23013

@ jimmy23013 Safari 5.0 또는 5.1을 사용해보십시오. 에 따르면 수 있습니까 사용 , 나이가 Safari에서 일부 지원은 여전히 유효하지 않은 것으로 간주한다 JS 많이 받아들이는 엄격 모드를 의미합니다. 비록 find? 어쩌면 부분적으로했다, 아직 구현되지 않았습니다 ... 단지 그것을 자신의 목록에있는 경우 ...
mbomb007
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.