Samy Kamkar的网站http://samy.pl知道控制台何时打开,并在打开时清除源代码/控制台。

这是怎么回事?
发布于 2017-02-13 06:41:50
这花了一些功夫。samy.pl在此代码之上有几个级别的间接和模糊处理。它使用的检测代码版本与JohanP找到的the GitHub repository版本不同。与GitHub存储库不同,samy.pl中的代码可以在devtools未停靠时检测到它们。
它通过使用一个简短的脚本来实现这一点,该脚本根据devtools是打开还是关闭而执行不同。
示例脚本
这是一个自包含的示例;在浏览器中打开它,并注意当devtools打开和关闭时输出是如何变化的(无论它是否停靠):
<!DOCTYPE html>
<html>
<body>
<pre id="output"></pre>
<script type="text/javascript">
var element = new Image;
var devtoolsOpen = false;
element.__defineGetter__("id", function() {
devtoolsOpen = true; // This only executes when devtools is open.
});
setInterval(function() {
devtoolsOpen = false;
console.log(element);
document.getElementById('output').innerHTML += (devtoolsOpen ? "dev tools is open\n" : "dev tools is closed\n");
}, 1000);
</script>
</body>
</html>它是如何工作的
setInterval每秒执行一次。无论devtools是打开还是关闭,console.log都将始终执行:console对象始终是已定义的。但是,log方法仅在devtools打开时才将输出写入控制台。如果devtools是关闭的,那么console.log就是一个no-op。这是让您检测devtools是否打开的关键:检测日志操作是否为no-op。
在将element写入控制台的过程中,它获取元素的id。它调用附加了__defineGetter__的函数。因此,只有当devtools打开并且console.log不是no-op时,console.log(element)才会调用该函数。在该函数中设置了该标志,每秒为我们提供devtools状态的更新视图。
samy.pl使用一些额外的技巧来隐藏这一点:控制台也每秒被清除一次,并且此代码使用空格(!)进行混淆。编码。
https://stackoverflow.com/questions/42193700
复制相似问题