お疲れ様です。
セーブデータの値を改ざんして
パラメーターやアイテムを不正に獲得するユーザーが後を絶たず困っております。
(私の作品では、アイテム収集を主なゲーム性としているため、大変迷惑しています)
こうしたゴト行為を防ぐプラグインを探しましたが、不思議と見つからなかったため
見よう見まねで作ってみようと考えました。
仕様は、以下のようなものです。
・セーブデータ作成時に、もう一つのセーブデータを保持しておき、ロード時にその差分でチェックを行う。
・バックアップ側のファイルは暗号化し、チェック時にのみ内部で復号化させる。
以下がコードになります。
コード: 全て選択
(function() {
// セーブデータのファイル名とバックアップファイル名
var saveFileName = 'file1.rpgsave';
var backupFileName = 'file1_backup.rpgsave';
// バックアップファイルのパス
var backupFilePath = 'save/' + backupFileName;
// バックアップファイルの暗号化キー
var encryptionKey = 'password';
// セーブデータの書き込み時にバックアップを作成する
var DataManager_makeSavefileInfo = DataManager.makeSavefileInfo;
DataManager.makeSavefileInfo = function() {
var info = DataManager_makeSavefileInfo.call(this);
if (info) {
// バックアップファイルを作成する
this.backupSaveFile();
}
return info;
};
// バックアップファイルを作成する関数
DataManager.backupSaveFile = function() {
// セーブデータファイルを読み込む
var saveFileData = StorageManager.load(saveFileName);
if (saveFileData) {
// バックアップファイルを作成する
var backupData = LZString.compressToBase64(saveFileData);
var encryptedBackupData = CryptoJS.AES.encrypt(backupData, encryptionKey).toString();
StorageManager.save(backupFileName, encryptedBackupData);
}
};
// セーブデータの読み込み時に改ざんを検出する
var DataManager_loadGame = DataManager.loadGame;
DataManager.loadGame = function(savefileId) {
if (this.isSavefileValid(savefileId)) {
// セーブデータファイルを読み込む
var saveFileData = StorageManager.load(saveFileName);
if (saveFileData) {
// バックアップファイルを読み込む
var encryptedBackupData = StorageManager.load(backupFilePath);
if (encryptedBackupData) {
var decryptedBackupData = CryptoJS.AES.decrypt(encryptedBackupData, encryptionKey).toString(CryptoJS.enc.Utf8);
var backupData = LZString.decompressFromBase64(decryptedBackupData);
// セーブデータとバックアップデータを比較する
if (saveFileData !== backupData) {
// 改ざんが検出された場合はエラーを表示してゲームを終了する
throw new Error('このセーブデータは改ざんされた可能性があります。ロードできません。');
}
}
}
DataManager_loadGame.call(this, savefileId);
}
};
})();
導入しましたが、セーブ時、デバッグコンソールに「Save data too big!」というエラーが出て
バックアップが作成されませんでした。
生成するファイルサイズの上限が超過しているものと思われますが
セーブデータ自体のサイズはとても小さいため、別の理由かと思われます。
他にどんな原因が考えられますでしょうか?
有識者の方のお知恵を拝借できましたら幸いです。
よろしくお願いいたします。