[javascript] JavaScript를 난독 화 (보호)하려면 어떻게해야합니까? [닫은]

오픈 소스가 아닌 JavaScript 응용 프로그램을 만들고 싶기 때문에 JS 코드를 난독 화하는 방법을 배우고 싶습니다. 이것이 가능한가?



답변

난처:

YUI 압축기를 사용해보십시오 . Yahoo UI 팀이 개발, 개선 및 유지 관리하는 매우 인기있는 도구입니다.

다음을 사용할 수도 있습니다.

업데이트 :이 질문은 원래 10 년 이상 전에 요청되었으며 YUI는 더 이상 유지되지 않습니다. Google Closure Compiler는 여전히 사용 중이며 노드 패키지 관리자를 통해 UglifyJS를 로컬로 실행할 수 있습니다.npm install -g uglify-js

개인 문자열 데이터 :

문자열 값을 비공개로 유지하는 것은 다른 관심사이며 난독 화는 실제로 큰 도움이되지 않습니다. 물론 소스를 깨져서 최소화 된 엉망으로 패키징하면 모호함을 통해 가벼운 보안 버전을 얻을 수 있습니다 됩니다. 대부분의 경우 소스를 보는 것은 사용자이며 클라이언트의 문자열 값은 사용 목적이므로 개인 문자열 값이 필요하지 않은 경우가 많습니다.

사용자가보고 싶지 않은 값을 실제로 가지고 있다면 몇 가지 옵션이 있습니다. 먼저 페이지로드시 해독되는 일종의 암호화를 수행 할 수 있습니다. 그것은 아마도 가장 안전한 옵션 중 하나 일뿐 만 아니라 불필요한 많은 작업 일 것입니다. 아마도 일부 문자열 값을 base64로 인코딩 할 수 있으며 더 쉬울 것입니다. 그러나 실제로 해당 문자열 값을 원하는 사람은 쉽게 해독 할있습니다 . 암호화는 모든 사람이 데이터에 액세스하지 못하도록 막는 유일한 방법이며, 대부분의 사람들은 필요 이상으로 보안을 강화합니다.

사이드 노트 :

Javascript의 난독 화는 일부 버그를 일으키는 것으로 알려져 있습니다. 난 독자 들은 그것에 대해 조금 더 나아지고 있지만, 많은 복장들은 그들이 축소 하고 찌그러 뜨리는 것으로 부터 충분한 이익을 볼 것이라고 결정하고 , 난독 화의 추가 절약이 항상 문제의 가치가있는 것은 아닙니다 . 소스를 보호하려는 경우 코드를 읽기 어렵게 만드는 것이 가치가 있다고 판단 할 수 있습니다. JSMin 은 좋은 대안입니다.


답변

구글 클로저 컴파일러에 대해 언급 한 사람이 아무도 없다 . 축소 / 압축뿐만 아니라 사용되지 않는 코드를 찾아 제거하기 위해 분석하고 최대 축소를 위해 다시 작성합니다. 또한 유형 검사를 수행 할 수 있으며 구문 오류에 대해 경고합니다.

JQuery는 최근 YUI Compresser에서 Closure Compiler로 전환하여 “고급 개선


답변

난독 화는 실제로 작동하지 않습니다. 실제로 코드를 얻고 싶은 사람이라면 속도가 빨라집니다. 더 나쁜 것은 사용자가 버그를 수정하지 못하도록하고 수정 사항을 사용자에게 다시 전달하지 못하게하며 현장의 문제를 진단하기 어렵게 만듭니다. 시간과 돈을 낭비합니다.

지적 재산권 법과 귀하의 법적 선택에 대해 변호사와 상담하십시오. “오픈 소스” 는 “사람이 소스를 읽을 수 있음”을 의미하지 않습니다. 대신 오픈 소스는 코드를 자유롭게 사용하고 수정할 수있는 권한을 부여하는 특정 라이센스 모델입니다. 그러한 라이센스를 부여하지 않으면 코드를 복사하는 사람들이 위반되며 (대부분의 경우) 라이센스를 중지 할 수있는 법적 옵션이 있습니다.

코드를 실제로 보호 할 수있는 유일한 방법은 코드를 제공하지 않는 것입니다. 중요한 코드를 서버 측으로 옮기고 공개 Javascript 코드가 Ajax를 호출하도록하십시오.

난 독자에 대한 내 답변은 여기를 참조하십시오.


답변

당신이 원하는 모든 자바 스크립트 소스를 난독 화 할 수 있지만 클라이언트 시스템에서 실제로 모든 소스 코드를 실행해야하기 때문에 항상 리버스 엔지니어링 할 수 있습니다 … 내가 생각할 수있는 가장 좋은 옵션은 모든 처리를 완료하는 것입니다. 서버 측 코드와 함께 자바 스크립트가 수행하는 모든 클라이언트 코드는 서버 자체에 처리 요청을 보냅니다. 그렇지 않으면 누구나 코드가 수행하는 모든 작업을 항상 추적 할 수 있습니다.

누군가 문자열을 안전하게 유지하기 위해 base64를 언급했습니다. 이것은 끔찍한 생각입니다. Base64는 코드를 리버스 엔지니어링하려는 사람들이 즉시 인식 할 수 있습니다. 그들이 할 첫 번째 일은 인코딩을 풀고 그것이 무엇인지 확인하는 것입니다.


답변

자유롭게 사용할 수있는 많은 JavaScript 난독 화 도구가 있습니다. 그러나 JavaScript를 역 엔지니어링 할 수없는 수준으로 난독 처리하기가 어렵다는 점에 유의해야한다고 생각합니다.

이를 위해 어느 정도 초과 근무 시간에 사용했던 몇 가지 옵션이 있습니다.

  • 유이 압축기 . Yahoo!의 JavaScript 압축기는로드 시간을 향상시키는 코드를 잘 압축합니다. 비교적 잘 작동하는 작은 난독 화 수준이 있습니다. 본질적으로 Compressor는 함수 이름을 변경하고 공백을 제거하며 지역 변수를 수정합니다. 이것이 내가 가장 자주 사용하는 것입니다. 이것은 오픈 소스 Java 기반 도구입니다.

  • JSMin 은 Douglas Crockford가 작성한 도구로 JavaScript 소스를 축소하려고합니다. 크록 포드 자신의 말에 따르면, “JSMin은 난독하지 않지만 어설프게 나타납니다.” 기본 목표는 브라우저에서 더 빠르게로드 할 수 있도록 소스 크기를 최소화하는 것입니다.

  • 무료 JavaScript Obfuscator . 이것은 실제로 코드를 인코딩하여 코드를 난독 처리하려는 웹 기반 도구입니다. 인코딩 방식 (혹은 난독 화)의 형태에 대한 절충은 파일 화 비용을 초래할 수 있다고 생각합니다. 그러나 그것은 개인적인 취향의 문제입니다.


답변

내가 할 것 :

A. 해커를 트롤하십시오!

이것은 두 번째 부분에서 가짜 / 난독 화 된 비밀 자바 스크립트 코드 런처입니다. 소스 코드에서 볼 수있는 것.

이 코드는 무엇입니까?

  1. 실제 코드를로드
  2. 사용자 정의 헤더를 설정합니다
  3. 맞춤 변수를 게시

var ajax=function(a,b,d,c,e,f){
 e=new FormData();
 for(f in d){e.append(f,d[f]);};
 c=new XMLHttpRequest();
 c.open('POST',a);
 c.setRequestHeader("Troll1","lol");
 c.onload=b;
 c.send(e);
};
window.onload=function(){
 ajax('Troll.php',function(){
  (new Function(atob(this.response)))()
 },{'Troll2':'lol'});
}

B. 코드를 약간 난독 처리

그게 뭐야?

  1. base64에서와 동일한 코드입니다.
  2. 이것은 SECRET 자바 스크립트 코드가 아닙니다.

(new Function(atob('dmFyIGFqYXg9ZnVuY3Rpb24oYSxiLGQsYyxlLGYpe2U9bmV3IEZvcm1EYXRhKCk7Zm9yKGYgaW4gZCl7ZS5hcHBlbmQoZixkW2ZdKTt9O2M9bmV3IFhNTEh0dHBSZXF1ZXN0KCk7Yy5vcGVuKCdQT1NUJyxhKTtjLnNldFJlcXVlc3RIZWFkZXIoIlRyb2xsMSIsImxvbCIpO2Mub25sb2FkPWI7Yy5zZW5kKGUpO307d2luZG93Lm9ubG9hZD1mdW5jdGlvbigpe2FqYXgoJ1Ryb2xsLnBocCcsZnVuY3Rpb24oKXsgKG5ldyBGdW5jdGlvbihhdG9iKHRoaXMucmVzcG9uc2UpKSkoKX0seydUcm9sbDInOidsb2wnfSk7fQ==')))()

C 실제 코드를 사용하여 PHP 파일을 표시하기 어렵게 만듭니다.

이 PHP 코드는 무엇입니까?

  1. 올바른 리퍼러를 확인합니다 (실행기의 도메인 / 디렉토리 / 코드)
  2. 커스텀 HEADER 확인
  3. 사용자 정의 POST 변수를 확인합니다

모든 것이 정상이라면 올바른 코드를 표시하거나 가짜 코드 또는 IP 금지를 표시합니다. 페이지를 닫으십시오.

<?php
$t1=apache_request_headers();
if(base64_encode($_SERVER['HTTP_REFERER'])=='aHR0cDovL2hlcmUuaXMvbXkvbGF1bmNoZXIuaHRtbA=='&&$_POST['Troll2']=='lol'&&$t1['Troll1']='lol'){
 echo 'ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkuaW5uZXJUZXh0PSdBd2Vzb21lJzsNCg==';//here is the SECRET javascript code
}else{
 echo 'd2luZG93Lm9wZW4oJycsICdfc2VsZicsICcnKTt3aW5kb3cuY2xvc2UoKTs=';
};
?>

base64 리퍼러 = http://here.is/my/launcher.html

비밀 자바 스크립트 = document.body.appendChild(document.createElement('div')).innerText='Awesome';

가짜 = window.open('', '_self', '');window.close();

이제 .. SECRET 자바 스크립트에서 이벤트 핸들러를 정의하는 경우 아마도 액세스 할 수 있습니다. 시작 코드를 사용하여 외부에서 중첩 된 SECRET 함수를 가리켜 서 정의해야합니다.

그래서 … 코드를 얻는 쉬운 방법이 있습니까?
document.body.appendChild(document.createElement('div')).innerText='Awesome';

이것이 작동하는지 확실하지 않지만 크롬을 사용하고 요소, 리소스, 네트워크, 소스, 타임 라인, 프로필, 감사를 사용하고 있지만 위의 줄을 찾지 못했습니다.

참고 1 : Inspect element-> network에서 Troll.php URL을 크롬으로 열면 가짜 코드가 표시됩니다.

참고 2 : 전체 코드는 최신 브라우저 용으로 작성되었습니다. polyfill에는 더 많은 코드가 필요합니다.

편집하다

launcher.html

<!doctype html><html><head><meta charset="utf-8"><title></title><script src="data:application/javascript;base64,KG5ldyBGdW5jdGlvbihhdG9iKCdkbUZ5SUdGcVlYZzlablZ1WTNScGIyNG9ZU3hpTEdRc1l5eGxMR1lwZTJVOWJtVjNJRVp2Y20xRVlYUmhLQ2s3Wm05eUtHWWdhVzRnWkNsN1pTNWhjSEJsYm1Rb1ppeGtXMlpkS1R0OU8yTTlibVYzSUZoTlRFaDBkSEJTWlhGMVpYTjBLQ2s3WXk1dmNHVnVLQ2RRVDFOVUp5eGhLVHRqTG5ObGRGSmxjWFZsYzNSSVpXRmtaWElvSWxSeWIyeHNNU0lzSW14dmJDSXBPMk11YjI1c2IyRmtQV0k3WXk1elpXNWtLR1VwTzMwN2QybHVaRzkzTG05dWJHOWhaRDFtZFc1amRHbHZiaWdwZTJGcVlYZ29KMVJ5YjJ4c0xuQm9jQ2NzWm5WdVkzUnBiMjRvS1hzZ0tHNWxkeUJHZFc1amRHbHZiaWhoZEc5aUtIUm9hWE11Y21WemNHOXVjMlVwS1Nrb0tYMHNleWRVY205c2JESW5PaWRzYjJ3bmZTazdmUT09JykpKSgp"></script></head><body></body></html>

트롤 .php

<?php $t1=apache_request_headers();if(/*base64_encode($_SERVER['HTTP_REFERER'])=='PUT THE LAUNCHER REFERER HERE'&&*/$_POST['Troll2']=='lol'&&$t1['Troll1']='lol'){echo 'ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkuaW5uZXJUZXh0PSdBd2Vzb21lJzsNCg==';}else{echo 'd2luZG93Lm9wZW4oJycsICdfc2VsZicsICcnKTt3aW5kb3cuY2xvc2UoKTs=';}; ?>


답변

JScrambler을 사용해보십시오 . 나는 최근에 그것을 스핀하고 그것에 감동했다. 세부 정보에 신경 쓰지 않고 신속하게 처리하려는 사람들을 위해 사전 정의 된 설정으로 난독 처리를위한 템플릿 세트를 제공합니다. 원하는 변환 / 기술을 선택하여 사용자 정의 난독 화를 생성 할 수도 있습니다.