浏览代码

`renamePropertiesAutoExclude` option changed by `renamePropertiesMode` option

sanex 4 年之前
父节点
当前提交
0acb91ca60

+ 5 - 0
CHANGELOG.md

@@ -1,5 +1,10 @@
 Change Log
 
+v2.11.0
+---
+* Added option `renamePropertiesMode` to switch between new `safe` and old `unsafe` modes of `renameProperties` option. Fixed https://github.com/javascript-obfuscator/javascript-obfuscator/issues/878
+* `renameProperties` option now works in `safe` way by default
+
 v2.10.7
 ---
 * Fixed CVE-2019-18413. Fixed https://github.com/javascript-obfuscator/javascript-obfuscator/issues/880

+ 15 - 2
README.md

@@ -371,6 +371,7 @@ Following options are available for the JS Obfuscator:
     optionsPreset: 'default',
     renameGlobals: false,
     renameProperties: false,
+    renamePropertiesMode: 'safe',
     reservedNames: [],
     reservedStrings: [],
     rotateStringArray: true,
@@ -429,6 +430,7 @@ Following options are available for the JS Obfuscator:
     --options-preset <string> [default, low-obfuscation, medium-obfuscation, high-obfuscation]
     --rename-globals <boolean>
     --rename-properties <boolean>
+    --rename-properties-mode <string> [safe, unsafe]
     --reserved-names '<list>' (comma separated)
     --reserved-strings '<list>' (comma separated)
     --rotate-string-array <boolean>
@@ -785,10 +787,12 @@ Enables obfuscation of global variable and function names **with declaration**.
 ### `renameProperties`
 Type: `boolean` Default: `false`
 
-##### :warning: this option **WILL** break your code in most cases. Enable it only if you know what it does!
+##### :warning: this option **MAY** break your code. Enable it only if you know what it does!
 
 Enables renaming of property names. All built-in DOM properties and properties in core JavaScript classes will be ignored.
 
+To switch between `safe` and `unsafe` modes of this option use [`renamePropertiesMode`](#renamepropertiesmode) option.
+
 To set format of renamed property names use [`identifierNamesGenerator`](#identifiernamesgenerator) option.
 
 To control which properties will be renamed use [`reservedNames`](#reservednames) option.
@@ -821,6 +825,15 @@ Example:
 }());
 ```
 
+### `renamePropertiesMode`
+Type: `string` Default: `safe`
+
+##### :warning: Even in `safe` mode, [`renameProperties`](#renameproperties) option **MAY** break your code.
+
+Specifies `renameProperties` option mode:
+* `safe` - default behaviour after `2.11.0` release. Trying to rename properties in a more safe way to prevent runtime errors.
+* `unsafe` - default behaviour before `2.11.0` release. Renames properties in an unsafe way without any restrictions.
+
 ### `reservedNames`
 Type: `string[]` Default: `[]`
 
@@ -1447,7 +1460,7 @@ See: [`Kind of variables`](#kind-of-variables)
 
 ### I enabled `renameProperties` option, and my code broke! What to do?
 
-Just disable this option.
+Try `renamePropertiesMode: 'safe'` option, if it still doesn't work, just disable this option.
 
 ## Backers
 

文件差异内容过多而无法显示
+ 0 - 0
dist/index.browser.js


文件差异内容过多而无法显示
+ 0 - 0
dist/index.cli.js


文件差异内容过多而无法显示
+ 0 - 0
dist/index.js


+ 1 - 1
package.json

@@ -1,6 +1,6 @@
 {
   "name": "javascript-obfuscator",
-  "version": "2.10.7",
+  "version": "2.11.0",
   "description": "JavaScript obfuscator",
   "keywords": [
     "obfuscator",

+ 9 - 2
src/cli/JavaScriptObfuscatorCLI.ts

@@ -15,8 +15,10 @@ import { IdentifierNamesGenerator } from '../enums/generators/identifier-names-g
 import { LoggingPrefix } from '../enums/logger/LoggingPrefix';
 import { ObfuscationTarget } from '../enums/ObfuscationTarget';
 import { OptionsPreset } from '../enums/options/presets/OptionsPreset';
+import { RenamePropertiesMode } from '../enums/node-transformers/rename-properties-transformers/RenamePropertiesMode';
 import { SourceMapMode } from '../enums/source-map/SourceMapMode';
 import { StringArrayEncoding } from '../enums/node-transformers/string-array-transformers/StringArrayEncoding';
+import { StringArrayIndexesType } from '../enums/node-transformers/string-array-transformers/StringArrayIndexesType';
 import { StringArrayWrappersType } from '../enums/node-transformers/string-array-transformers/StringArrayWrappersType';
 
 import { DEFAULT_PRESET } from '../options/presets/Default';
@@ -30,7 +32,6 @@ import { Logger } from '../logger/Logger';
 import { ObfuscatedCodeWriter } from './utils/ObfuscatedCodeWriter';
 import { SourceCodeReader } from './utils/SourceCodeReader';
 import { Utils } from '../utils/Utils';
-import { StringArrayIndexesType } from '../enums/node-transformers/string-array-transformers/StringArrayIndexesType';
 
 export class JavaScriptObfuscatorCLI implements IInitializable {
     /**
@@ -285,9 +286,15 @@ export class JavaScriptObfuscatorCLI implements IInitializable {
                 BooleanSanitizer
             )
             .option(
-                '--rename-properties <boolean>', 'UNSAFE: Enables renaming of property names. This probably WILL break your code',
+                '--rename-properties <boolean>', 'UNSAFE: Enables renaming of property names. This probably MAY break your code',
                 BooleanSanitizer
             )
+            .option(
+                '--rename-properties-mode <boolean>',
+                'Specify `--rename-properties` option mode. ' +
+                `Values: ${CLIUtils.stringifyOptionAvailableValues(RenamePropertiesMode)}. ` +
+                `Default: ${RenamePropertiesMode.Safe}`
+            )
             .option(
                 '--rotate-string-array <boolean>', 'Enable rotation of string array values during obfuscation',
                 BooleanSanitizer

+ 9 - 0
src/enums/node-transformers/rename-properties-transformers/RenamePropertiesMode.ts

@@ -0,0 +1,9 @@
+import { Utils } from '../../../utils/Utils';
+
+export const RenamePropertiesMode: Readonly<{
+    Safe: 'safe';
+    Unsafe: 'unsafe';
+}> = Utils.makeEnum({
+    Safe: 'safe',
+    Unsafe: 'unsafe'
+});

+ 2 - 1
src/interfaces/options/IOptions.ts

@@ -2,6 +2,7 @@ import { TOptionsPreset } from '../../types/options/TOptionsPreset';
 import { TStringArrayIndexesType } from '../../types/options/TStringArrayIndexesType';
 import { TStringArrayEncoding } from '../../types/options/TStringArrayEncoding';
 import { TStringArrayWrappersType } from '../../types/options/TStringArrayWrappersType';
+import { TRenamePropertiesMode } from '../../types/options/TRenamePropertiesMode';
 import { TTypeFromEnum } from '../../types/utils/TTypeFromEnum';
 
 import { IdentifierNamesGenerator } from '../../enums/generators/identifier-names-generators/IdentifierNamesGenerator';
@@ -29,7 +30,7 @@ export interface IOptions {
     readonly optionsPreset: TOptionsPreset;
     readonly renameGlobals: boolean;
     readonly renameProperties: boolean;
-    readonly renamePropertiesAutoExclude: boolean;
+    readonly renamePropertiesMode: TRenamePropertiesMode;
     readonly reservedNames: string[];
     readonly reservedStrings: string[];
     readonly rotateStringArray: boolean;

+ 2 - 1
src/node-transformers/rename-properties-transformers/RenamePropertiesTransformer.ts

@@ -13,6 +13,7 @@ import { NodeTransformationStage } from '../../enums/node-transformers/NodeTrans
 import { AbstractNodeTransformer } from '../AbstractNodeTransformer';
 import { NodeGuards } from '../../node/NodeGuards';
 import { NodeLiteralUtils } from '../../node/NodeLiteralUtils';
+import { RenamePropertiesMode } from '../../enums/node-transformers/rename-properties-transformers/RenamePropertiesMode';
 
 @injectable()
 export class RenamePropertiesTransformer extends AbstractNodeTransformer {
@@ -91,7 +92,7 @@ export class RenamePropertiesTransformer extends AbstractNodeTransformer {
         node: ESTree.Node,
         parentNode: ESTree.Node
     ): void {
-        if (this.options.renamePropertiesAutoExclude) {
+        if (this.options.renamePropertiesMode === RenamePropertiesMode.Safe) {
             this.analyzeAutoExcludedPropertyNames(node, parentNode);
         }
     }

+ 5 - 3
src/options/Options.ts

@@ -20,6 +20,7 @@ import {
 
 import { TInputOptions } from '../types/options/TInputOptions';
 import { TOptionsPreset } from '../types/options/TOptionsPreset';
+import { TRenamePropertiesMode } from '../types/options/TRenamePropertiesMode';
 import { TStringArrayIndexesType } from '../types/options/TStringArrayIndexesType';
 import { TStringArrayEncoding } from '../types/options/TStringArrayEncoding';
 import { TStringArrayWrappersType } from '../types/options/TStringArrayWrappersType';
@@ -31,6 +32,7 @@ import { IOptionsNormalizer } from '../interfaces/options/IOptionsNormalizer';
 import { IdentifierNamesGenerator } from '../enums/generators/identifier-names-generators/IdentifierNamesGenerator';
 import { ObfuscationTarget } from '../enums/ObfuscationTarget';
 import { OptionsPreset } from '../enums/options/presets/OptionsPreset';
+import { RenamePropertiesMode } from '../enums/node-transformers/rename-properties-transformers/RenamePropertiesMode';
 import { SourceMapMode } from '../enums/source-map/SourceMapMode';
 import { StringArrayIndexesType } from '../enums/node-transformers/string-array-transformers/StringArrayIndexesType';
 import { StringArrayEncoding } from '../enums/node-transformers/string-array-transformers/StringArrayEncoding';
@@ -216,10 +218,10 @@ export class Options implements IOptions {
     public readonly renameProperties!: boolean;
 
     /**
-     * @type {boolean}
+     * @type {RenamePropertiesMode}
      */
-    @IsBoolean()
-    public readonly renamePropertiesAutoExclude!: boolean;
+    @IsIn([RenamePropertiesMode.Safe, RenamePropertiesMode.Unsafe])
+    public readonly renamePropertiesMode!: TRenamePropertiesMode;
 
     /**
      * @type {string[]}

+ 0 - 2
src/options/OptionsNormalizer.ts

@@ -10,7 +10,6 @@ import { DeadCodeInjectionRule } from './normalizer-rules/DeadCodeInjectionRule'
 import { DeadCodeInjectionThresholdRule } from './normalizer-rules/DeadCodeInjectionThresholdRule';
 import { DomainLockRule } from './normalizer-rules/DomainLockRule';
 import { InputFileNameRule } from './normalizer-rules/InputFileNameRule';
-import { RenamePropertiesAutoExcludeRule } from './normalizer-rules/RenamePropertiesAutoExcludeRule';
 import { SeedRule } from './normalizer-rules/SeedRule';
 import { SelfDefendingRule } from './normalizer-rules/SelfDefendingRule';
 import { SourceMapBaseUrlRule } from './normalizer-rules/SourceMapBaseUrlRule';
@@ -31,7 +30,6 @@ export class OptionsNormalizer implements IOptionsNormalizer {
         DeadCodeInjectionThresholdRule,
         DomainLockRule,
         InputFileNameRule,
-        RenamePropertiesAutoExcludeRule,
         SeedRule,
         SelfDefendingRule,
         SourceMapBaseUrlRule,

+ 0 - 18
src/options/normalizer-rules/RenamePropertiesAutoExcludeRule.ts

@@ -1,18 +0,0 @@
-import { TOptionsNormalizerRule } from '../../types/options/TOptionsNormalizerRule';
-
-import { IOptions } from '../../interfaces/options/IOptions';
-
-/**
- * @param {IOptions} options
- * @returns {IOptions}
- */
-export const RenamePropertiesAutoExcludeRule: TOptionsNormalizerRule = (options: IOptions): IOptions => {
-    if (!options.renameProperties) {
-        options = {
-            ...options,
-            renamePropertiesAutoExclude: false
-        };
-    }
-
-    return options;
-};

+ 2 - 1
src/options/presets/Default.ts

@@ -3,6 +3,7 @@ import { TInputOptions } from '../../types/options/TInputOptions';
 import { IdentifierNamesGenerator } from '../../enums/generators/identifier-names-generators/IdentifierNamesGenerator';
 import { ObfuscationTarget } from '../../enums/ObfuscationTarget';
 import { OptionsPreset } from '../../enums/options/presets/OptionsPreset';
+import { RenamePropertiesMode } from '../../enums/node-transformers/rename-properties-transformers/RenamePropertiesMode';
 import { SourceMapMode } from '../../enums/source-map/SourceMapMode';
 import { StringArrayIndexesType } from '../../enums/node-transformers/string-array-transformers/StringArrayIndexesType';
 import { StringArrayEncoding } from '../../enums/node-transformers/string-array-transformers/StringArrayEncoding';
@@ -31,7 +32,7 @@ export const DEFAULT_PRESET: TInputOptions = Object.freeze({
     optionsPreset: OptionsPreset.Default,
     renameGlobals: false,
     renameProperties: false,
-    renamePropertiesAutoExclude: false,
+    renamePropertiesMode: RenamePropertiesMode.Safe,
     reservedNames: [],
     reservedStrings: [],
     rotateStringArray: true,

+ 2 - 1
src/options/presets/NoCustomNodes.ts

@@ -2,6 +2,7 @@ import { TInputOptions } from '../../types/options/TInputOptions';
 
 import { IdentifierNamesGenerator } from '../../enums/generators/identifier-names-generators/IdentifierNamesGenerator';
 import { ObfuscationTarget } from '../../enums/ObfuscationTarget';
+import { RenamePropertiesMode } from '../../enums/node-transformers/rename-properties-transformers/RenamePropertiesMode';
 import { SourceMapMode } from '../../enums/source-map/SourceMapMode';
 import { StringArrayEncoding } from '../../enums/node-transformers/string-array-transformers/StringArrayEncoding';
 import { StringArrayWrappersType } from '../../enums/node-transformers/string-array-transformers/StringArrayWrappersType';
@@ -28,7 +29,7 @@ export const NO_ADDITIONAL_NODES_PRESET: TInputOptions = Object.freeze({
     numbersToExpressions: false,
     renameGlobals: false,
     renameProperties: false,
-    renamePropertiesAutoExclude: false,
+    renamePropertiesMode: RenamePropertiesMode.Safe,
     reservedNames: [],
     reservedStrings: [],
     rotateStringArray: false,

+ 5 - 0
src/types/options/TRenamePropertiesMode.ts

@@ -0,0 +1,5 @@
+import { TTypeFromEnum } from '../utils/TTypeFromEnum';
+
+import { RenamePropertiesMode } from '../../enums/node-transformers/rename-properties-transformers/RenamePropertiesMode';
+
+export type TRenamePropertiesMode = TTypeFromEnum<typeof RenamePropertiesMode>;

+ 2 - 1
test/dev/dev.ts

@@ -1,6 +1,7 @@
 'use strict';
 
 import { NO_ADDITIONAL_NODES_PRESET } from '../../src/options/presets/NoCustomNodes';
+import { RenamePropertiesMode } from '../../src/enums/node-transformers/rename-properties-transformers/RenamePropertiesMode';
 
 (function () {
     const JavaScriptObfuscator: any = require('../../index');
@@ -22,7 +23,7 @@ import { NO_ADDITIONAL_NODES_PRESET } from '../../src/options/presets/NoCustomNo
             ...NO_ADDITIONAL_NODES_PRESET,
             compact: false,
             renameProperties: true,
-            renamePropertiesAutoExclude: true
+            renamePropertiesMode: RenamePropertiesMode.Safe
         }
     ).getObfuscatedCode();
 

+ 0 - 20
test/functional-tests/options/OptionsNormalizer.spec.ts

@@ -257,26 +257,6 @@ describe('OptionsNormalizer', () => {
             });
         });
 
-        describe('renamePropertiesAutoExclude', () => {
-            before(() => {
-                optionsPreset = getNormalizedOptions({
-                    ...getDefaultOptions(),
-                    renameProperties: false,
-                    renamePropertiesAutoExclude: true
-                });
-
-                expectedOptionsPreset = {
-                    ...getDefaultOptions(),
-                    renameProperties: false,
-                    renamePropertiesAutoExclude: false
-                };
-            });
-
-            it('should normalize options preset', () => {
-                assert.deepEqual(optionsPreset, expectedOptionsPreset);
-            });
-        });
-
         describe('seedRule', () => {
             describe('Variant #1: seed value is string', () => {
                 before(() => {

部分文件因为文件数量过多而无法显示