Eval的正规用法是执行一段JS代码。
但它做为代码分析者的手段,也经常被用于调试分析:用eval运行某些函数,获得返回值、了解代码执行结果。
如何反eval调试、防止代码被eval执行?
我们可以在函数中抛出一个错误并捕获其堆栈跟踪,进而来检查调用栈中是否包含eval,便可识别是否是被eval调试,并可做出相应的操作。
例程:
执行效果:
实际使用中,为了防止反Eval的代码逻辑被看到,当然不会使用console.log提示,可以换作return错误的值之类。还要将代码进行混淆加密,比如用JShaman进行JS代码混淆后,上面的示例可以变成难以阅读和理解的代码形式:
注意:
这个方式,可用于浏览器或Node.JS中检测eval。但在某些特殊的运行环境中,例如:微信、支付宝等H5小游戏中的代码,是不可以使用的,因为这些场景中经常也是使用eval来执行代码的,阻止了eval执行会导致错误。如下图:
但这似乎也说明用此方式反eval确实是够强大的。
热门跟贴