Javascript库:混淆或不混淆 - 这就是问题所在

mor*_*ous 22 javascript obfuscation

我需要编写一个GUI相关的JavaScript库.它会给我的网站带来一些优势(就我能提供的功能而言) - 直到我的竞争对手玩它足够长的时间来弄清楚如何自己编写它(或者最终破解下载的脚本).我可以接受这样一个事实:它会随着时间的推移而被模仿 - 这对于课程(它的业务部分)而言是相同的.我只想在几个月的时间里呼吸人们去的地方"哇 - 他们这样做了怎么样?" - 这给了我几个月的免费宣传和一些动力去转移到其他事情上.

为了清楚起见,我甚至不关心那些仍然会破解消息来源的核心黑客 - 这就是一场不值得战斗的输掉战争(无论如何我接受我的代码并非"如此珍贵").然而,我无法忍受的是,通过使用任何人都可以下载和使用的普通JavaScript,有效地简单地将所有可能进入图书馆的辛勤工作交给我的竞争对手.如果有人打算使用我的工作,那么我肯定不想简单地把它交给他们 - 我希望他们努力解码它.如果他们可以解码它,他们应该得到代码(他们很可能会发现他们自己可以编写更好的代码 - 他们只是没有') - 所以,我并没有声称没有人可以写这个(这在任何情况下都是一个荒谬的主张) - 而是,我所说的是没有人(到目前为止)已经使我的功能谈论,可用于这个特定的行业 - 而我(作为一个企业家而不是一个极客/编码员),想要为它的所有价值赢得它,而它持续,直到它(不可避免地)被黑客攻击.

已经确定的事实是,我正在"攻击"的行业中没有一个网站具有此功能,因此这种库的价值是不可否认的,并且不值得讨论(即这不是我在这里要求的).

我想要找到的是混淆javascript库的优点和缺点,以便我可以做出最终决定.

我最关心的两个问题是调试,以及混淆器可能引入的细微错误.

我想知道:

  1. 如何管理这些风险(能够调试错误的代码,确保/最小化混淆错误)

  2. 您是否可以推荐任何质量好的行业标准混淆器(最好是您自己使用的东西).

  3. 您在生产环境中使用混淆代码的经历是什么?

dec*_*eze 33

如果他们可以解码它们,他们应该得到代码(他们很可能发现他们自己可以编写更好的代码 - 他们只是没有商业意义将所有[普通的香草]组件放在特定的顺序中).

实际上,您正试图通过技术措施来解决业务问题.

任何值得他作为Javascript程序员的人应该能够通过查看产品本身来重新创建你很容易做的事情,而不需要代码.这并不像你正在发明一些前所未见的新魔法,你只是以一种新的方式将各个部分组合在一起,就像你承认自己一样.这只是Javascript.

即使你对脚本进行模糊处理,它仍然可以按原样运行,竞争对手可以随意使用它并运行它.即使使用模糊代码,一些自定义也不应该太难.

在您的利基业务中,如果有人"偷走"您的脚本,您可能会很快注意到.如果发生这种情况,这是一个法律问题.如果你的竞争对手想要合法清楚,那么无论如何他们都必须从头开始重写脚本,这会自动为你买一些时间.

如果您的竞争对手在技术上无法在不直接窃取代码的情况下复制您的产品,那么无论代码是清晰还是模糊,都不会产生任何影响.

  • @morpheous在正确的时间以正确的理念和正确的执行在正确的地方比拥有一些需要不惜一切代价隐藏的秘密酱更重要.只要看看Twitter,在不查看任何代码的情况下克隆是微不足道的,但这就是派对的地方. (2认同)

tad*_*man 15

虽然你可以沿着混淆器的漫长而危险的道路前行,但你通常不会在实际的生产应用程序中看到它们,原因很简单,因为它们并没有真正起作用.您会注意到,谷歌应用程序,实际上是一堆专有且非常有价值的JavaScript,只有真正最小化并且没有混淆,尽管最小化程序现在的工作方式,它们与混淆一样好.你真的需要知道你正在做什么来从中提取意义,但确定的将成功.

另一个问题是混淆的代码必须工作,如果它有效,人们可以批量撕掉它,而不是理解它的大部分,并按照他们认为合适的形式使用它.当然,他们不能直接修改它,但是在一些补丁上重新实现他们不喜欢的部分而不必太深入并不难.这只是JavaScript的本质.

谷歌之类没有遭遇大量剪切和粘贴竞争对手的原因是因为JavaScript只是软件包的一部分.为了对这些东西的使用方式和位置进行任何程度的控制,大型组件需要基于服务器.好消息是,您可以利用Node.js之类的东西,轻松地分割客户端和服务器代码,而无需使用完全不同的语言重新实现部件.

你可能想要研究的不是混淆,而是将你的应用程序分成可以从某种服务按需加载的部分,并且因为这些部分可能是高度相互依赖的,并且在没有这个核心的情况下大部分都是非功能性的在服务器上,您可以更大程度地控制使用此库的时间和位置.

您可以在Google如何转移到元库中看到这些元素,元库只是作为其他库的加载器.这是统一Google Apps,Google AdSense,Google地图,Google Adwords等负载调用的一步.

如果你想变得有点聪明,你可以像谷歌地图一样添加毒药,因为它们是动态提供的,因此它们只能在特定的子域中运行.这需要根据需要生成它们,虽然它可以随时以足够的专业知识删除,但它可以防止JavaScript文件的批量复制粘贴使用.要插入一个验证document.href的聪明的调用并不难,并且在一个积极最小化的文件中查找所有这些实例将特别令人愤怒,可能不值得努力.

  • +1非常有用且信息丰富。你能告诉我更多关于这种“毒丸”方法的信息吗(我喜欢,我喜欢)——具体来说,验证 document.href 的部分。那 + minify 可能是一个可行的解决方案 (2认同)