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

Javascript Rails-如何使用sprocket动态混淆js文件,javascript,ruby-on-rails,node.js,obfuscation,sprockets,Javascript,Ruby On Rails,Node.js,Obfuscation,Sprockets,我最近不得不在我的rails应用程序中混淆js资产。我不想对每个文件都手工操作,而是想动态地操作。问题:没有太多的js模糊器与rails一起运行,并且是可定制的 最后我决定使用 我强调,在任何情况下,我都不打算将其用于生产。它严格限制了开发,当我推进到prod时,我将“rakeassets:precompile” 首先,我在Rails.root中安装了node+javascript模糊器 npm install --save-dev javascript-obfuscator 在applica

我最近不得不在我的rails应用程序中混淆js资产。我不想对每个文件都手工操作,而是想动态地操作。问题:没有太多的js模糊器与rails一起运行,并且是可定制的

最后我决定使用

我强调,在任何情况下,我都不打算将其用于生产。它严格限制了开发,当我推进到prod时,我将“rakeassets:precompile”

首先,我在Rails.root中安装了node+javascript模糊器

npm install --save-dev javascript-obfuscator
在application.rb中,我添加了:

Sprockets.register_postprocessor('application/javascript', Transformer.new)
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
在application.rb中,我还添加了:

Sprockets.register_postprocessor('application/javascript', Transformer.new)
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
这将在链轮处理js代码(post_processor)后捕获它,将其写入tmp文件,在tmp_out js文件中对其进行模糊处理,并将其内容返回到管道

我只是把这个限制在我的几个文件里。如您所知,只有在正在处理的javascript包含字符串“to_be_compiled”时,才会执行该过程

请注意,我的文件是由Babel在链轮之前预处理的js.jsx。因此,Babel使我能够添加选项:{comments:false,compact:true},用于删除所有注释,\n和\t。您需要确保js文件符合此格式

希望有帮助