在 JavaScript 制作的游戏中隐藏内容以防止作弊
Hiding content to prevent cheating in JavaScript-made game
我知道完全防止用户作弊and/or破解一个web应用是不可能的,但是我发现的这个漏洞太容易发现了,确实应该堵上。
https://mcthompsonatl.github.io/
我实际上并没有编写任何代码。我得到了一个非常基本的 "find all 6 objects"(在本例中为钥匙)猜谜游戏,该游戏是一位不是程序员的前雇员为我们的一位客户的晋升而编写的。逻辑是合理的,它需要一些格式化工作,但是在开发者模式下测试时,我花了很短的时间发现只需检查 [=12] 的每个 <div>
就可以轻松赢得游戏=] class。因为这是用于促销竞赛,所以我一直在尝试找出一种方法来隐藏或更改破坏游戏的代码,以在开发者模式下检查任何卡片都不会显示任何提示。
我能找到的一种解决方案是将卡片元素更改为多个 HTML5 Canvas 元素。这样做的两个问题是 1。我对 Canvas 和 2 的工作经验为零。即使我这样做了,这似乎也是一项极其漫长和痛苦的任务,我不确定我是否会被允许我需要学习足够的时间来解决问题。这是可以用 PHP 隐藏的东西吗?我在这里找到一个明智的解决方案有点难过。感谢任何帮助。
评论太长了。
根据我对游戏的了解。你有 36 个盒子,你需要点击随机盒子。如果您点击正确方框的 X 号,您就赢了。
我可以通过检查 HTML 并搜索指示获胜密钥的图像来作弊。图片名称是 images/keytowin/frontImage.png
一个解决方案可能是不将指示 "correct" 选择的图像预先分配给 HTML div。相反,仅在单击图像后才分配图像。这将使它更难找到,因为单独 HTML 不会泄露它。
这里的想法是Random
。使用Javascript,生成1到36之间的3个随机数。这三个随机数表示中奖的盒子。如果用户单击一个框,并且它具有相同的编号(我注意到 div
编号为 data-id="1"
),然后使用 JS 在内部 div 动态添加图像。
不过,这三个随机数将在游戏开始时确定。因此,隐藏变量很重要。
我提供了一个示例代码来演示这个概念。
var luckyNumbers = getUniqueNumbers();
var winImg = "<img src='https://mcthompsonatl.github.io/images/keytowin/frontImage.png' alt='X LOGO'>";
var loseImg = "<img src='https://mcthompsonatl.github.io/images/keytowin/TryAgain.png' alt='X LOGO'>";
console.log(luckyNumbers);
$(".card").on("click", function() {
if (!$(this).hasClass("clicked")) {
$(this).addClass("clicked");
selected = Number($(this).attr("data-id"));
if (luckyNumbers.indexOf(selected) > -1) {
//code to put a key image
$(this).find(".back").append(winImg);
} else {
console.log("wrong: " + selected);
//code to put not-winning image
$(this).find(".back").append(loseImg);
}
}
});
function getUniqueNumbers() {
var arr = []
while (arr.length < 3) {
var someRand = Math.ceil(Math.random() * 36)
if (arr.indexOf(someRand) > -1) continue;
arr[arr.length] = someRand;
}
return arr;
}
img {
width: 50px;
}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta content="width=device-width" name="viewport">
<title>JS Bin</title>
</head>
<body>
<div class="game">
<div class="card" data-id="5">
<div class="inside">
<div class="front">
<img src="image/someimage.jpg" alt="keytowin">
</div>
<div class="back">
</div>
</div>
</div>
<div class="card" data-id="6">
<div class="inside">
<div class="front">
<img src="image/someimage.jpg" alt="keytowin">
</div>
<div class="back">
</div>
</div>
</div>
<div class="card" data-id="7">
<div class="inside">
<div class="front">
<img src="image/someimage.jpg" alt="keytowin">
</div>
<div class="back">
</div>
</div>
</div>
</div>
<script src="https://code.jquery.com/jquery-2.2.4.js">
</script>
</body>
</html>
我知道完全防止用户作弊and/or破解一个web应用是不可能的,但是我发现的这个漏洞太容易发现了,确实应该堵上。
https://mcthompsonatl.github.io/
我实际上并没有编写任何代码。我得到了一个非常基本的 "find all 6 objects"(在本例中为钥匙)猜谜游戏,该游戏是一位不是程序员的前雇员为我们的一位客户的晋升而编写的。逻辑是合理的,它需要一些格式化工作,但是在开发者模式下测试时,我花了很短的时间发现只需检查 [=12] 的每个 <div>
就可以轻松赢得游戏=] class。因为这是用于促销竞赛,所以我一直在尝试找出一种方法来隐藏或更改破坏游戏的代码,以在开发者模式下检查任何卡片都不会显示任何提示。
我能找到的一种解决方案是将卡片元素更改为多个 HTML5 Canvas 元素。这样做的两个问题是 1。我对 Canvas 和 2 的工作经验为零。即使我这样做了,这似乎也是一项极其漫长和痛苦的任务,我不确定我是否会被允许我需要学习足够的时间来解决问题。这是可以用 PHP 隐藏的东西吗?我在这里找到一个明智的解决方案有点难过。感谢任何帮助。
评论太长了。
根据我对游戏的了解。你有 36 个盒子,你需要点击随机盒子。如果您点击正确方框的 X 号,您就赢了。
我可以通过检查 HTML 并搜索指示获胜密钥的图像来作弊。图片名称是 images/keytowin/frontImage.png
一个解决方案可能是不将指示 "correct" 选择的图像预先分配给 HTML div。相反,仅在单击图像后才分配图像。这将使它更难找到,因为单独 HTML 不会泄露它。
这里的想法是Random
。使用Javascript,生成1到36之间的3个随机数。这三个随机数表示中奖的盒子。如果用户单击一个框,并且它具有相同的编号(我注意到 div
编号为 data-id="1"
),然后使用 JS 在内部 div 动态添加图像。
不过,这三个随机数将在游戏开始时确定。因此,隐藏变量很重要。
我提供了一个示例代码来演示这个概念。
var luckyNumbers = getUniqueNumbers();
var winImg = "<img src='https://mcthompsonatl.github.io/images/keytowin/frontImage.png' alt='X LOGO'>";
var loseImg = "<img src='https://mcthompsonatl.github.io/images/keytowin/TryAgain.png' alt='X LOGO'>";
console.log(luckyNumbers);
$(".card").on("click", function() {
if (!$(this).hasClass("clicked")) {
$(this).addClass("clicked");
selected = Number($(this).attr("data-id"));
if (luckyNumbers.indexOf(selected) > -1) {
//code to put a key image
$(this).find(".back").append(winImg);
} else {
console.log("wrong: " + selected);
//code to put not-winning image
$(this).find(".back").append(loseImg);
}
}
});
function getUniqueNumbers() {
var arr = []
while (arr.length < 3) {
var someRand = Math.ceil(Math.random() * 36)
if (arr.indexOf(someRand) > -1) continue;
arr[arr.length] = someRand;
}
return arr;
}
img {
width: 50px;
}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta content="width=device-width" name="viewport">
<title>JS Bin</title>
</head>
<body>
<div class="game">
<div class="card" data-id="5">
<div class="inside">
<div class="front">
<img src="image/someimage.jpg" alt="keytowin">
</div>
<div class="back">
</div>
</div>
</div>
<div class="card" data-id="6">
<div class="inside">
<div class="front">
<img src="image/someimage.jpg" alt="keytowin">
</div>
<div class="back">
</div>
</div>
</div>
<div class="card" data-id="7">
<div class="inside">
<div class="front">
<img src="image/someimage.jpg" alt="keytowin">
</div>
<div class="back">
</div>
</div>
</div>
</div>
<script src="https://code.jquery.com/jquery-2.2.4.js">
</script>
</body>
</html>