我想知道是否有办法阻止在我的浏览器游戏网站上使用用户脚本?
许多人使用 Greasemonkey 比其他玩家更有优势,我想要一种禁用这些脚本的方法。
我找到了这篇旧文章“如何在您的网站上禁用 Greasemonkey”,但它是 2005 年的,似乎不起作用。
我想知道是否有办法阻止在我的浏览器游戏网站上使用用户脚本?
许多人使用 Greasemonkey 比其他玩家更有优势,我想要一种禁用这些脚本的方法。
我找到了这篇旧文章“如何在您的网站上禁用 Greasemonkey”,但它是 2005 年的,似乎不起作用。
与聪明的脚本编写者作斗争是很困难的。他们占上风,因为他们的脚本可以在您的服务器之前触摸页面,并且可以阻止或替换几乎任何东西。请参阅this answer to a very similar question。
您最聪明、最具成本效益的对策是制裁正在“玩”游戏的用户。攻击窃贼,而不是开锁者。
如果您坚持与您的用户进行技术战争,那么您所做的任何事情都不会阻止所有人,但您可以让他们为之工作。
以下是您可以做的一些事情,让脚本编写者的生活更加艰难:
经常更改页面的结构,尤其是元素 ID 和 CSS 类名称。如果可以,请定期插入或删除元素,例如,键<div>
并不总是第二个中的第三个<table>
。
每次进行更改时,请监视性能或使用率突然下降的用户的日志——无论他们需要多少小时或几天来调整脚本。
同样,经常更改您的 javascript 文件名,并更改脚本编写者可能使用的任何变量或函数的名称。
将您的点击和键盘事件处理程序编写为仅适用于受信任的事件,适用于支持它的浏览器。
您可以将关键文本(包括倒数计时器)放在名称无法预测的图像中。使脚本难以检测关键事件。需要进行 OCR 会大大提高 Greasemonkey 编剧所需的技能水平。(至少现在。)
如果您将关键的游戏动作移动到Flash中,编写脚本的难度会大一个数量级。他们甚至可能不得不对您的闪存进行逆向工程,并将其替换为具有可编写脚本挂钩的闪存。不过,切换到Flash会惹恼并赶走用户(比如我)。
有关更多信息,请参阅该答案,但最好和最具成本效益的方法是制裁违规用户。不过,请确保您的服务条款明确禁止他们所做的事情。
作为 Brock Adams 自己的回答的补充,这里有几种寻找可能的脚本编写者的方法。
注意:理解代码的脚本编写者可以绕过所有客户端功能。
注意:使用这些需要一些智慧和良好的计划。如果做错了事,那么使用客户端的东西,你就有可能让用户的浏览器跪下或对你自己的服务器进行 DDoSing。或者,如果您使用过多的自动化,您可能会在更新自己的代码后最终禁止至少一半的用户群。
这是我的脚本之一。它肯定仍然可以使用一些工作,但是框架就在那里(尽管您可能需要将所有内容包装在一个大函数中以使变量私有)
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);
};