我最近不得不在我的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文件符合此格式。
希望它有所帮助!