Eval的正規用法是執行一段JS代碼。
但它做為代碼分析者的手段,也經常被用于調試分析:用eval運行某些函數,獲得返回值、了解代碼執行結果。
如何反eval調試、防止代碼被eval執行?
我們可以在函數中拋出一個錯誤并捕獲其堆棧跟蹤,進而來檢查調用棧中是否包含eval,便可識別是否是被eval調試,并可做出相應的操作。
例程:
執行效果:
實際使用中,為了防止反Eval的代碼邏輯被看到,當然不會使用console.log提示,可以換作return錯誤的值之類。還要將代碼進行混淆加密,比如用JShaman進行JS代碼混淆后,上面的示例可以變成難以閱讀和理解的代碼形式:
注意:
這個方式,可用于瀏覽器或Node.JS中檢測eval。但在某些特殊的運行環境中,例如:微信、支付寶等H5小游戲中的代碼,是不可以使用的,因為這些場景中經常也是使用eval來執行代碼的,阻止了eval執行會導致錯誤。如下圖:
但這似乎也說明用此方式反eval確實是夠強大的。
特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.