0

我想知道是否有办法阻止在我的浏览器游戏网站上使用用户脚本?

许多人使用 Greasemonkey 比其他玩家更有优势,我想要一种禁用这些脚本的方法。

我找到了这篇旧文章“如何在您的网站上禁用 Greasemonkey”,但它是 2005 年的,似乎不起作用。

4

3 回答 3

6

与聪明的脚本编写者作斗争是很困难的。他们占上风,因为他们的脚本可以在您的服务器之前触摸页面,并且可以阻止或替换几乎任何东西。请参阅this answer to a very similar question

您最聪明、最具成本效益的对策是制裁正在“玩”游戏的用户。攻击窃贼,而不是开锁者。

如果您坚持与您的用户进行技术战争,那么您所做的任何事情都不会阻止所有人,但您可以让他们为之工作。
以下是您可以做的一些事情,让脚本编写者的生活更加艰难:

  1. 经常更改页面的结构,尤其是元素 ID 和 CSS 类名称。如果可以,请定期插入或删除元素,例如,键<div>并不总是第二个中的第三个<table>

    每次进行更改时,请监视性能或使用率突然下降的用户的日志——无论他们需要多少小时或几天来调整脚本。

  2. 同样,经常更改您的 javascript 文件名,并更改脚本编写者可能使用的任何变量或函数的名称。

  3. 将您的点击和键盘事件处理程序编写为仅适用于受信任的事件,适用于支持它的浏览器。

  4. 您可以将关键文本(包括倒数计时器)放在名称无法预测的图像中。使脚本难以检测关键事件。需要进行 OCR 会大大提高 Greasemonkey 编剧所需的技能水平。(至少现在。)

  5. 如果您将关键的游戏动作移动到Flash中,编写脚本的难度会大一个数量级。他们甚至可能不得不对您的闪存进行逆向工程,并将其替换为具有可编写脚本挂钩的闪存。不过,切换到Flash会惹恼并赶走用户(比如我)。

有关更多信息,请参阅该答案,但最好和最具成本效益的方法是制裁违规用户。不过,请确保您的服务条款明确禁止他们所做的事情。

于 2012-12-07T12:52:46.777 回答
1

作为 Brock Adams 自己的回答的补充,这里有几种寻找可能的脚本编写者的方法。

  • 定时功能,检查 DOM 树并搜索不是您的代码创建的添加元素,或查找丢失的元素。
  • 检查 cookie 内容并寻找用户添加内容的提示。
    • 如果脚本编写者必须将信息从页面/会话传输到另一个,并且没有/不知道其他方法,他可能会尝试为此使用 cookie。
  • 检查 URL 中的查询/哈希是否有您的代码未添加的内容。
    • 可以尝试通过更改链接将信息传输到其他页面。
    • 哈希内容(URL 中的#)只能在客户端访问。
  • 检查会话/本地存储。
    • 客户端。
  • 通过匿名服务禁用访问,例如anonym.to
    • 可以绕开,但会让使用不需要的在线工具的人生活更加困难。
  • 仅当引用者正确 时才允许访问游戏页面,否则重定向到登录页面。
    • 另一种限制从外部来源访问游戏页面的方法。
    • 如果您想成为痛苦,请在重定向时终止活动会话。

注意:理解代码的脚本编写者可以绕过所有客户端功能。
注意:使用这些需要一些智慧和良好的计划。如果做错了事,那么使用客户端的东西,你就有可能让用户的浏览器跪下或对你自己的服务器进行 DDoSing。或者,如果您使用过多的自动化,您可能会在更新自己的代码后最终禁止至少一半的用户群。

于 2014-02-26T13:23:00.397 回答
-1

这是我的脚本之一。它肯定仍然可以使用一些工作,但是框架就在那里(尽管您可能需要将所有内容包装在一个大函数中以使变量私有)

var secureElements,secureTags,secureTagLoop,secureLoop,var secureReporter = secureAnalyzationFunction = 0;
function analyze(secureAnalyzation){
	if(secureAnalyzation.indexOf("function ")!=-1){
		secureAnalyzationFunction = secureAnalyzation.substring(secureAnalyzation.indexOf("function ")+9,secureAnalyzation.indexOf("()"));
		secureAnalyzationFunction = secureAnalyzationFunction+"=undefined;";
		eval(secureAnalyzationFunction);
	}
}
function secure(){
	var secureTags = ["script","link","meta","canvas"];
	for(secureTagLoop=0;secureTagLoop!=secureTags.length;secureTagLoop++){
		secureElements = document.getElementsByTagName(secureTags[secureTagLoop]);
		for(secureLoop=0;secureLoop!=secureElements.length;secureLoop++){
			if(secureElements[secureLoop].outerHTML.indexOf("verified")==-1){
				analyze(secureElements[secureLoop].outerHTML);
				secureElements[secureLoop].parentElement.removeChild(secureElements[secureLoop]);
				secureLoop--;
				secureReporter++;
				console.log("Deleted "+secureReporter+" foreign elements.")
			}
		}
	}
}
window.onload = function() {
	secure();
	setInterval(secure,1500);
};

于 2016-04-27T00:57:26.677 回答