インライン構成
JSDefender では部分的な保護を行うことができます。インライン構成ディレクティブを使用すれば、ソース コード内に保護オプションを設定できます。保護設定を定義するには、"use strict"
のような JavaScript ディレクティブを使用します。このセクションでは、JSDefender インライン構成を使用して部分的な保護を行う方法を学習します。
JavaScript ディレクティブ
JavaScript でディレクティブは、コードの先頭か、ブロック ステートメントの先頭に記述する文字列リテラルです。コードに他のステートメントを記述した場合、後続の文字列リテラルはディレクティブとは見なされません。次の短いコード スニペットは、どのリテラルがディレクティブで、どのリテラルがディレクティブでないかを示します。
"directive #1";
"directive #2";
var counter = 0;
"this is not a directive";
"nor this";
function square(n) {
"directive #3";
var result = n * n;
"not a directive";
return result;
}
if (square(2) === 4) {
"directive #4";
console.log("test passes.");
"not a directive";
}
インライン構成への JSDefender ディレクティブの使用
ブール リテラルの置き換えを適用するとします。CLI で次のコマンドを発行できます。
jsdefender input.js protected.js -b
インライン構成を使用すれば、ソース コードに JSDefender ディレクティブを追加できます。
"@jsdefender { booleanLiterals: true }";
var x = true;
var y = false;
function w() {
var x = false;
var y = true;
}
これにより、次のようにコマンド ラインで -b
スイッチを省略しても同じ結果が得られるようになります。
jsdefender input.js protected.js
上記の入力の 1 行目にある "@jsdefender { booleanLiterals: true }"
リテラルは、ディレクティブと呼ばれる有効な JavaScript の構成要素です。ディレクティブは、JavaScript では "use strict"
モードでのみ使用されます。
JSDefender のインライン構成ディレクティブ
JSDefender のディレクティブは @jsdefender
プレフィックスで始めます。JavaScript ではディレクティブは各ブロック ステートメントの先頭にのみ記述できますが、JSDefender では次のディレクティブのみを記述でき、他の構文は無視されます。
- プログラムのディレクティブ
- 関数(宣言、標準的な関数式、またはアロー関数)に属するディレクティブ
- クラス メソッドのディレクティブ
- オブジェクト メソッドのディレクティブ
いくつかの例を見てみましょう。
プログラムのディレクティブ
"@jsdefender { booleanLiterals: true }";
const allow = true;
関数宣言のディレクティブ
function myAcmeFunction(a, b) {
"@jsdefender { integerLiterals: true }";
return a + b;
}
関数式のディレクティブ
const myAcmeFunction = function (a, b) {
"@jsdefender { integerLiterals: true }";
return a + b;
};
アロー関数のディレクティブ
const myAcmeFunction = (a, b) => {
"@jsdefender { integerLiterals: true }";
return a + b;
};
クラス メソッドのディレクティブ
class myAcmeClass {
myAcmeMethod(a, b) {
"@jsdefender { integerLiterals: true }";
return a + b;
}
}
オブジェクト メソッドのディレクティブ
const myAcmeObj = {
myAcmeMethod(a, b) {
"@jsdefender { integerLiterals: true }";
return a + b;
},
};
インライン保護ディレクティブの形式
保護エンジンにより、jsdefender
プレフィックスが付いた複数のディレクティブが、1 つの JSON 文字列としてまとめられます。たとえば、次のディレクティブがあるとします。
"@jsdefender {";
'@jsdefender "integerLiterals": {';
'@jsdefender "radix": "octal"';
"@jsedefender }";
"@jsdefender }";
JSDefender により、これらのディレクティブのコンテンツが抽出されて次の JSON としてまとめられます。
{
"integerLiterals": {
"radix": "octal"
}
}
もちろん、この構成は次の 1 つのディレクティブを使って記述することも可能です。
'@jsdefender { "integerLiterals": { "radix": "octal" } }';
使いやすい JavaScript オブジェクト リテラル構文も使用できます(プロパティ名を囲む一重引用符や二重引用符は不要)。
"@jsdefender {";
"@jsdefender integerLiterals: {";
'@jsdefender "radix": "octal"';
"@jsedefender }";
"@jsdefender }";
または
'@jsdefender { integerLiterals: { "radix": "octal" } }';
名前付き構成セット セクションで、特定の構成オプション セットに対してキーを使用できることを学習しました。このキーをインライン構成ディレクティブ内で使用できます。例を次に示します。
"@jsdefender medium";
medium
を含む名前付き構成セットを構成ファイルに記述する必要があります。
また、特別な名前付きセットのキー off
、disbale-inline
、default
も使用できます。この設定を使用することで、たとえば次のように specialFunc
関数の保護を無効にすることができます。
function specialFunc() {
"@jsdefender off";
console.log("Entered into specialFunc");
// ...
}
インライン構成設定のマージ
既出の構成のマージ セクションで説明したように、インライン構成の設定は、コマンド ラインの設定および構成ファイルの設定とマージされます。インライン構成の設定は常に他の設定より優先されます。JSDefender は、保護プロセスを実行する際、変換する各ソース コード要素に対し、直近のインライン構成を適用します。この構成モードでは、複雑であるにもかかわらず追跡しやすい保護シナリオを作成できます。
たとえば、次の入力内容では、プログラム全体に対してブール リテラルの置き換えが有効にされています。
"@jsdefender { booleanLiterals: true }";
var x = true;
var y = false;
function w() {
var x = false;
var y = true;
}
次のように変更すると、w
関数の本文のみが保護されます。
var x = true;
var y = false;
function w() {
"@jsdefender { booleanLiterals: true }";
var x = false;
var y = true;
}
w
の本文を除くすべてが保護される次のようなシナリオを宣言することもできます。
"@jsdefender { booleanLiterals: true }";
var x = true;
var y = false;
function w() {
"@jsdefender { booleanLiterals: false }";
var x = false;
var y = true;
}
上記のような設定により、w
関数内のコードに対し、ブール リテラル変換のみが無効になります。あるいは、次のようにすべての保護を無効にすることもできます。
"@jsdefender { booleanLiterals: true }";
var x = true;
var y = false;
function w() {
"@jsdefender off";
var x = false;
var y = true;
}
各保護設定を有効または無効にする以上のことを行えます。各変換のオプションを調整できます。たとえば、次のコード スニペットでは、w
の本文におけるブール リテラル ランダム化を有効にしています。
"@jsdefender { booleanLiterals: true }";
var x = true;
var y = false;
function w() {
"@jsdefender { booleanLiterals: { randomize: true } }";
var x = false;
var y = true;
}
保護オプションを null
に設定すると、そのオプションが無効になるということを覚えておいてください。したがって、この場合は、null
の設定により w
の本文におけるブール リテラル置き換えが無効になります。
"@jsdefender { booleanLiterals: true }";
var x = true;
var y = false;
function w() {
"@jsdefender { booleanLiterals: null }";
var x = false;
var y = true;
}
インラインの保護ディレクティブの無効化
パフォーマンスの変化を評価する場合や、トラブルシューティング、試験を行う場合など、インライン保護ディレクティブを無効にしたい場合があります。無効にする方法はいくつかあります。
最も簡単な方法は、コマンド スイッチ
--disable-inline
を使用することです。あるいは、構成ファイルにプロパティと値
"disableInline": true
を追加する方法もあります。入力全体から個々のファイルを選択して、保護ディレクティブを選択的に無視するという方法もあります。入力の構成が以下のようであるとします。
{
"inputs": ["file1.js", "file2.js"]
}
file2.js
に対してのみインライン保護ディレクティブを無視したい場合は、次のように宣言します。
{
"inputs": [
"file1.js",
{
"in": "file2.js",
"protection": "disable-inline"
}
]
}
- ソース コード ファイルの一部に対してインライン ディレクティブを使用するという方法もあります。
"@jsdefender heavy";
init();
// ...
function init() {
"@jsdefender disableInline";
createObjects();
doAdditionalInit();
// ...
function createObjects() {
"@jsdefender { stringLiterals: true }";
// ...
}
function doAdditionalInit() {
"@jsdefender { localDeclarations: false }";
// ...
}
}
createObjects
および doAdditionalInit
関数の中にディレクティブを設定した場合でも、それらのディレクティブは無視されます。親スコープ(init
)でインライン ディレクティブが無効にされているため、保護は init
内にあるその他すべてのインライン設定を無視します。
グローバルな保護ディレクティブ
JSDefender は、いくつかのインライン保護ディレクティブをグローバル(ファイル)レベルでのみ適用します。
- 日付ロック
- ドメイン ロック
- 開発者ツールのブロック
- コンソールのクローキング
- グローバル オブジェクトの非表示
インライン ディレクティブでこれらのオプションのいずれかを使用すると、JSDefender はその都度、警告メッセージを発します。そのようなディレクティブは保護処理を停止しません。JSDefender はそれらを無視します。