JSDefender™ secures your JavaScript apps against tampering, misuse and data theft using sophisticated obfuscation and active protection techniques.

Some example transforms include:

Transform Description
DomainLock Allows binding the code to a specific domain (or its subdomains). When the code running in the browser originates from a non-matching domain, it breaks with an error.
BooleanLiterals Transforms the false and true literals to other expressions that result in the same false and true values, respectively.
IntegerLiterals Transforms integer literals to other (less obvious) expressions that result in the same value when evaluated. It can also transform all integer literals to a specific radix (binary, decimal, hexadecimal, or octal).
PropertyIndirection Transforms direct property access to indirect property access.
StringLiterals Extracts string literals into variables and initializes those variables from encoded string literals. Replaces the original string with the corresponding variables.
LocalDeclaration Mangles the names of local declarations.
DebuggerRemoval Removes information from production code that can help hackers inspect your code.
ControlFlow Flattening Obfuscates the program's control flow by adding opaque predicates or dead code and flattening the control flow.

What does protected & obfuscated JavaScript look like:

BEFORE


BankABC.fundingSources.create('1xM821zkPUob1dmeNfhJedI1h5JkFRoC3Ja9Y8SLXp0EStArMT', {
	routingNumber: getVal('routingNumber'),
	accountNumber: getVal('accountNumber'),
	type: getVal('type'),
	name: getVal('name')
}, function (err, res) {
	console.log('Error: ' + JSON.stringify(err) + ' -- Response: ' + JSON.stringify(res));
});
customer_url = 'https://api-sandbox.BankABC.com/customers/AB993D36-3757-69C1-C3B4-29727FB3111C'
	customer = app_token.post("#{customer_url}/funding-sources-token")
	$('form').on('submit', function () {
		BankABC.configure('sandbox');
		var token = 'X9Bv3NuSrML7Ke1mcGmCT0EpwW34GSmDaYP09UfCpeWde46Jug';
		var bankInfo = {
			routingNumber: $('routingNumber').val(),
			accountNumber: $('accountNumber').val(),
			type: $('type').val(),
			name: $('name').val()
		}
		BankABC.fundingSources.create(token, bankInfo, callback);
		return false;
	});
function callback(err, res) {
	var $div = $('');
	var logValue = {
		error: err,
		response: res
	};
	$div.text(JSON.stringify(logValue));
	console.log(logValue);
	$('#logs').append($div);
}

AFTER


var Acjgb=ghsgb("uf}wz}t@|fapv`");var cemgb=ghsgb("pavrgv");var wZcgb=ghsgb
('\x22k^+!\x22ixCF|q\x22w~v]u{YvwZ\x22{&YxUA|P Yr*J+@_Kc#V@gRa^G');var 
Yaggb=ghsgb("a|fgz}t]f~qva");var sWWfb=ghsgb("rpp|f}g]f~qva");var UXZfb=ghsgb
("gjcv");var oTQfb=ghsgb("}r~v");var QUTfb=ghsgb("\x7F|t");var QoHgb=ghsgb
('Vaa|a)3');var sqKgb=ghsgb("`gaz}tzuj");var MlBgb=ghsgb('3>>3Av`c|}`v)3');var 
onEgb=ghsgb('{ggc`)<`r}wq|k=Qr}xRQP=p|~ 
$&$>%*P\x22>P Q\x27>!*$!$UQ \x22\x22\x22P');var Iivgb=ghsgb("c|`g");var 
kkygb=ghsgb("0hpf`g|~vaLfa\x7Fn`|fapv`>g|xv}");var Efpgb=ghsgb
('u|a~');function ghsgb(QIuhb){var kElhb="";for(var MFohb=0;MFohbQIuhb.
length;MFohb++){kElhb+=String.fromCharCode(QIuhb.charCodeAt(MFohb)^0x13);}
return kElhb;}var gBfhb=ghsgb("|}");var ICihb=ghsgb('`fq~zg');var cyZgb=ghsgb
("p|}uztfav");var Ezchb=ghsgb('`r}wq|k');var YuTgb=ghsgb('K*Qe ]f@a^_$Xv\x22~
pT~PG#VcdD \x27T@~WrJC#*FuPcvDwv\x27%Yft');var AwWgb=ghsgb
("er\x7F");var UrNgb=ghsgb('');var wtQgb=ghsgb("vaa|a");var wNDhb=ghsgb("av`c|}`v");
var YOGhb=ghsgb("gvkg");var sKxhb=ghsgb('0\x7F|t`');var ULAhb=ghsgb("rccv}w");
(BankABC[Acjgb][cemgb](wZcgb,{[Yaggb]:getVal(Yaggb),[sWWfb]:getVal(sWWfb),
[UXZfb]:getVal(UXZfb),[oTQfb]:getVal(oTQfb)},function(ofqeb,Qgteb){console
[QUTfb](QoHgb+JSON[sqKgb](ofqeb)+MlBgb+JSON[sqKgb](Qgteb));}),
customer_url=onEgb,customer=app_token[Iivgb](kkygb),$(Efpgb)[gBfhb](ICihb,
function(){BankABC[cyZgb](Ezchb);var kckeb=YuTgb;var Mdneb={[Yaggb]:$
(Yaggb)[AwWgb](),[sWWfb]:$(sWWfb)[AwWgb](),[UXZfb]:$(UXZfb)[AwWgb](),
[oTQfb]:$(oTQfb)[AwWgb]()};BankABC[Acjgb][cemgb](kckeb,Mdneb,oHrhb);
return (NaN===NaN);}));function oHrhb(gZdeb,Iaheb){var cWXdb=$(UrNgb);var 
EXaeb={[wtQgb]:gZdeb,[wNDhb]:Iaheb};cWXdb[YOGhb]
(JSON[sqKgb](EXaeb)),console[QUTfb](EXaeb),$(sKxhb)[ULAhb](cWXdb)}

How is PreEmptive Protection for JavaScript better than other solutions?

  • We don't require you to send your unprotected code to us. We would not send our own unprotected code to a remote service and we would not expect you to either.
  • Unlike some of the open source tools we've tested, our products have a high level of quality and first rate support.