{{위키데이터 속성 추적}}
'''JSFuck'''은 Martin Kleppe가 개발한 [[자바스크립트]]의 난해한 프로그래밍 스타일의 하나로, 코드는 제한된 다양한 문자 집합을 사용하여 작성된다: <code>(</code>,<code>)</code>, <code>[</code>, <code>]</code>, <code>+</code>, <code>!</code>. 이 이름은 오직 구두점만의 최소주의적 알파벳을 사용하는 [[난해한 프로그래밍 언어]]의 하나인 [[브레인퍽]]에서 비롯된 것이다. 브레인퍽과 달리 JSFuck은 유효한 자바스크립트 코드인데, 즉 JSFuck 프로그램들은 자바스크립트를 해석하는 어떠한 [[웹 브라우저]]나 [[자바스크립트 엔진|엔진]]에서라도 실행할 수 있다는 의미이다.

JSFuck의 도전은 오직 6자를 사용하여 완전한 집합의 자바스크립트 함수들을 다시 만들어내는 데 기인하며, 자바스크립트의 두 가지 속성을 통해 실현할 수 있다:
# 약한 타이핑의 프로그래밍 언어이다.
# 식을 어떠한 형으로든 평가가 가능하다.<ref>Jane Bailey/[[The Daily WTF]]: "Bidding on Security". http://thedailywtf.com/articles/bidding-on-security</ref>

JSFuck은 원래 보안 우회 기술을 개선하는데 초점을 둔 온라인 대회의 일부로서 개발되었다.<ref>https://web.archive.org/web/20110301054929/http://sla.ckers.org/forum/read.php?24%2C32930  Yet Another Useless Contest (but fun!) Less chars needed to run arbitrary JS code</ref> 이를테면 [[크로스 사이트 스크립팅]](XSS) 공격과 같이 [[웹사이트]]에 제출되는 [[악성 코드]]의 발견을 우회하기 위해 사용할 수 있다.<ref>https://arstechnica.com/security/2016/02/ebay-has-no-plans-to-fix-severe-bug-that-allows-malware-distribution/ Ars Technica: Ebay has no plans to fix severe bugs that allows malware distribution</ref> JSFuck의 다른 잠재적 이용은 [[난독화|코드 난독화]]에 있다.
또, 비공식적으로 최적화된 버전의 JSFuck을 이용하여 [[자바스크립트]] [[라이브러리]]의 하나인 [[제이쿼리]]를 인코딩하기도 하였으며 이는 6개의 구별된 문자만으로 이루어진, 완전하게 기능하는 동등한 버전이다.<ref>https://github.com/fasttime/jquery-screwed jQuery JavaScript library made of only six different characters: ! ( ) + [ ]</ref>

== 문자표 ==
가장 짧은 JSFuck 식의 문자들은 아래에 나열되어 있다. 다른 문자들도 표현할 수 있으나 상당히 긴 코드를 만들어낸다.

{| class="wikitable"
! 문자 || JSFuck
|-
|style="text-align: center;" | <code>+</code> || <code>(+(+!+[]+(!+[]+[])[!+[]+!+[]+!+[]]+[+!+[]]+[+[]]+[+[]])+[])[!+[]+!+[]]</code>
|-
|style="text-align: center;" | <code>.</code> || <code>(+(+!+[]+[+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+[!+[]+!+[]]+[+[]])+[])[+!+[]]</code>
|-
|style="text-align: center;" | <code>0</code> || <code>+[]</code>
|-
|style="text-align: center;" | <code>1</code> || <code>+!![]</code> or <code>+!+[]</code>
|-
|style="text-align: center;" | <code>2</code> || <code>!![]+!![]</code> or <code>!+[]+!+[]</code>
|-
|style="text-align: center;" | <code>3</code> || <code>!![]+!![]+!![]</code> or <code>!+[]+!+[]+!+[]</code>
|-
|style="text-align: center;" | <code>4</code> || <code>!![]+!![]+!![]+!![]</code> or <code>!+[]+!+[]+!+[]+!+[]</code>
|-
|style="text-align: center;" | <code>5</code> || <code>!![]+!![]+!![]+!![]+!![]</code> or <code>!+[]+!+[]+!+[]+!+[]+!+[]</code>
|-
|style="text-align: center;" | <code>6</code> || <code>!![]+!![]+!![]+!![]+!![]+!![]</code> or <code>!+[]+!+[]+!+[]+!+[]+!+[]+!+[]</code>
|-
|style="text-align: center;" | <code>7</code> || <code>!![]+!![]+!![]+!![]+!![]+!![]+!![]</code> or <code>!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]</code>
|-
|style="text-align: center;" | <code>8</code> || <code>!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]</code> or <code>!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]</code>
|-
|style="text-align: center;" | <code>9</code> || <code>!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]</code> or <code>!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]+!+[]</code>
|-
|style="text-align: center;" | <code>a</code> || <code>(![]+[])[+!+[]]</code>
|-
|style="text-align: center;" | <code>d</code> || <code>([][[]]+[])[!+[]+!+[]]</code>
|-
|style="text-align: center;" | <code>e</code> || <code>(!![]+[])[!+[]+!+[]+!+[]]</code>
|-
|style="text-align: center;" | <code>f</code> || <code>(![]+[])[+[]]</code>
|-
|style="text-align: center;" | <code>i</code> || <code>([![]]+[][[]])[+!+[]+[+[]]]</code>
|-
|style="text-align: center;" | <code>I</code> || <code>(+(+!+[]+(!+[]+[])[!+[]+!+[]+!+[]]+(+!+[])+(+[])+(+[])+(+[]))+[])[+[]]</code>
|-
|style="text-align: center;" | <code>l</code> || <code>(![]+[])[!+[]+!+[]]</code>
|-
|style="text-align: center;" | <code>N</code> || <code>(+[![]]+[])[+[]]</code>
|-
|style="text-align: center;" | <code>n</code> || <code>([][[]]+[])[+!+[]]</code>
|-
|style="text-align: center;" | <code>r</code> || <code>(!+[]+[])[+!+[]]</code>
|-
|style="text-align: center;" | <code>s</code> || <code>(![]+[])[!+[]+!+[]+!+[]]</code>
|-
|style="text-align: center;" | <code>t</code> || <code>(!!+[]+[])[+[]]</code>
|-
|style="text-align: center;" | <code>u</code> || <code>([][[]]+[])[+[]]</code>
|-
|style="text-align: center;" | <code>y</code> || <code>(+[![]]+[+(+!+[]+(!+[]+[])[!+[]+!+[]+!+[]]+(+!+[])+(+[])+(+[])+(+[]))])[+!+[]+[+[]]]</code>
|}

== 보안 ==
JSFuck처럼 일반적인 자바스크립트의 구별된 기능들이 부족한 암호화 기술들은 악성 자바스크립트 코드가 침입 방지 시스템<ref name="medina">Ré Medina,  Matías A. (2012-09). Bypassing WAFs with non-alphanumeric XSS. Retrieved from http://blog.infobytesec.com/2012/09/bypassing-wafs-with-non-alphanumeric-xss.html.</ref>이나 콘텐트 필터를 우회하는 것을 도와줄 수 있다. 이를테면 JSFuck의 영숫자들이 결여된 상황과 더불어 콘텐츠 필터가 결함이 있을 경우 판매자들은 임의의 JSFuck 스크립트를 자신들의 이베이 옥션 페이지에 임베드할 수 있게 하였다.<ref>{{웹 인용|url=https://arstechnica.com/security/2016/02/ebay-has-no-plans-to-fix-severe-bug-that-allows-malware-distribution/|title=eBay has no plans to fix "severe" bug that allows malware distribution [Updated]|work=Ars Technica}}</ref>

== 같이 보기 ==
* [[브레인퍽]]
== 각주 ==
{{각주}}

== 외부 링크 ==
* [http://www.jsfuck.com/ JSFuck - Write any JavaScript with 6 Characters (with a JavaScript-to-JSFuck-converter)]
* [https://github.com/aemkei/jsfuck/blob/master/jsfuck.js JavaScript code of the aforementioned converter]

[[분류:난해한 프로그래밍 언어]]
[[분류:자바스크립트]]