Rails - 如何使用sprocket动态混淆js文件

时间:2017-02-17 11:49:52

标签: javascript ruby-on-rails node.js obfuscation sprockets

我最近不得不在我的rails应用程序中混淆js资产。我不想手动为每个文件做这件事,而是想在飞行中做到这一点。问题:没有多少js混淆器运行rails并可自定义。

最后我决定使用https://github.com/javascript-obfuscator/javascript-obfuscator

我强调在任何情况下我都不打算在生产中使用它。它严格限制开发,当我推动生产时,我会“掠夺资产:预编译”。

首先我在Rails.root中安装了node + javascript-obfuscator

npm install --save-dev javascript-obfuscator
在application.rb中

我添加了:

Sprockets.register_postprocessor('application/javascript', Transformer.new)

也在application.rb中我添加了:

class Transformer
  def call(input)
    return {data: input[:data]} unless input[:data].to_s.include?("to_be_compiled")
    stamp = Time.now.to_i.to_s
    File.open("tmp/obfuscate/tmp#{stamp}.js", "w+") do |f|
        f.write(input[:data])
    end

    parameters = " --compact true"
    parameters += " --controlFlowFlattening true"
    parameters += " --controlFlowFlatteningThreshold 1"
    parameters += " --debugProtection true"
    parameters += " --debugProtectionInterval true" 
    parameters += " --disableConsoleOutput true" 
    parameters += " --domainLock 'localhost'" 
    parameters += " --rotateStringArray true" 
    parameters += " --seed #{stamp}"
    parameters += " --selfDefending true" 
    parameters += " --stringArray true" 
    parameters += " --stringArrayEncoding true" 
    parameters += " --stringArrayThreshold 0.8" 
    parameters += " --unicodeEscapeSequence true"

    order = 'node node_modules/javascript-obfuscator/bin/javascript-obfuscator.js tmp/obfuscate/tmp'+stamp+'.js --output tmp/obfuscate/tmp_out'+stamp+'.js'+parameters 
    system(order)
    data = File.read("tmp/obfuscate/tmp_out"+stamp+".js") 
    system("rm -rf tmp/obfuscate/*")
    return { data: data }
  end
end

这将捕获(post_processor)之后的js代码,它由Sprockets处理,将其写入tmp文件,在tmp_out js文件中对其进行模糊处理并将其内容返回到管道。

我只需将此限制为我的一些文件。因此,您可以阅读,只有正在处理的javascript包含字符串“to_be_compiled”时才会执行该过程。

请注意,我的文件是在Sprockets之前由Babel预处理的js.jsx。所以Babel允许我添加选项:{comments:false,compact:true},它会删除所有注释,\ n和\ t。您需要确保您的js文件符合此格式。

希望它有所帮助!

0 个答案:

没有答案