前端源碼安全

来源:http://www.cnblogs.com/lovesong/archive/2016/02/09/5185543.html
-Advertisement-
Play Games

今天思考下前端源碼安全的東西(不是前端安全,只是針對於源碼部分)。在我看來,源碼安全有兩點,一是防止抄襲,二是防止被攻破。實際上講,前端的代碼大多是沒有什麼可抄襲性,安全更是形同虛設的(任何前端輸入都是不能相信的)。但如果還是想防止源碼被查看,HTML、CSS並不能做什麼,最終都會用露出來(最簡單用


今天思考下前端源碼安全的東西(不是前端安全,只是針對於源碼部分)。在我看來,源碼安全有兩點,一是防止抄襲,二是防止被攻破。實際上講,前端的代碼大多是沒有什麼可抄襲性,安全更是形同虛設的(任何前端輸入都是不能相信的)。但如果還是想防止源碼被查看,HTML、CSS並不能做什麼,最終都會用露出來(最簡單用Chrome開發者工具就可以看到),所以只能針對JS做文件的壓縮合併和混淆。

關於抄襲

其實就前端來講,代碼沒有什麼好抄襲的,大多人都是抄UI設計(這個是躲不了),還有一些富前端的控制項和演算法,重要之處還是在於後端,而後端是抄不了的。所以前端文件壓縮合併,目的並不是防止抄襲,而是為了減少文件體積、加快載入速度,提高程式的執行性能,當然壓縮也有混淆的功能。文件混淆是防止其他人查看代碼邏輯,但是生成的代碼比原代碼體積大得多,所以文件如果做了混淆,載入速度和執行速度都會有所下降。

關於安全

所有的用戶輸入都是不能相信的,如果後端的檢查校驗還做得不好,那就可能被攻破。前端代碼的邏輯如果還被瞭解清楚,那就是雪上加霜。後端的問題我們前端管不著,前端的代碼安全,簡單的可以用壓縮解決、再進一步就去混淆,讓別人看不懂。

HTML壓縮

很少有人去做HTML的壓縮(特指去除空白字元和註釋),根據其他資料有幾個原因:

1. HTML文檔中,多個空白字元等價為一個空白字元。也就是說換行等空白字元的刪除是不安全的,可能導致元素的樣式產生差異。

2. HTML元素中,有一個pre, 表示 preformatted text. 裡面的任何空白,都不能被刪除。

3. HTML中有可能有 IE 條件註釋。這些條件註釋是文檔邏輯的一部分,不能被刪除。

也是鑒於上面幾個原因,不提倡壓縮HTML,通過gzip壓縮就已經能達到很好的效果。

CSS壓縮合併

CSS壓縮合併很常見,或者說是必做的,可以由後端動態生成或工具提前生成。目的也只是為了提高載入速度,CSS即便的壓縮之後,代碼也是清晰可見,沒有混淆說法。CSS壓縮合併的工具很多,一般是用sass、less直接生成壓縮後的CSS,如果是直接壓縮,用grunt還不錯。

JS壓縮合併混淆

在生產環境上,壓縮合併是必做的。就如上面說的,目的不是為了防止暴露業務邏輯,是為了提高載入速度。在上一篇文章《AngularJS結合RequireJS做文件合併壓縮的那些坑》,說了一點JS壓縮合併要註意的東西。除了用RequireJS,直接使用grunt來做發佈是不錯的方式,開發後一鍵調用grunt。

grunt需要配置兩個文件:

package.json:聲明應用信息和使用依賴庫的版本

{
    "name":"BingoTouch",
    "version":"3.0.0",
    "engines":{
        "node":">= 0.8.0"
    },
    "devDependencies":{
        "grunt":"~0.4.0",
        "grunt-contrib-concat":"~0.3.0",
        "grunt-contrib-copy" : "~0.4.1",
        "grunt-contrib-cssmin" : "~0.6.0",
        "grunt-contrib-uglify":"~0.2.0",
        "express":""
    }
}

Gruntfile.js:聲明壓縮合併的文件

module.exports = function(grunt){
     grunt.initConfig({
        pkg : grunt.file.readJSON('package.json'),
        concat : {
            'dist/bingotouch.js' :
               [ 'demo/js/ui.js',
                 'demo/js/module/ui.GarbageCollection.js',
                 'demo/js/module/ui.plugins.js']
        },
        uglify : {
            target : {
                files : {
                    'dist/bingotouch.min.js': 'dist/bingotouch.js'
                }
            }
        }
     });
    grunt.loadNpmTasks('grunt-contrib-concat');
    grunt.loadNpmTasks('grunt-contrib-uglify');
    grunt.registerTask('default', ['concat','uglify']);
}

JS的混淆我到現在為止還沒用過,原理都是類似的,混淆是把JS代碼變成亂七八糟的字元串,然後用eval執行。

PS:uglify本身有一定的混淆作用,但也只是對變數名的混淆,混淆度並不夠。

混淆前:

function hello(){
    alert('hello');
}

混淆後:

eval(function(p,a,c,k,e,r){e=String;if(!''.replace(/^/,String)){while(c--)r[c]=k[c]||c;k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('1 0(){2(\'0\')}',3,3,'hello|function|alert'.split('|'),0,{})) 

不同混淆演算法混淆的結果不一樣,而且混淆後也不是一勞永逸,還是可以被反混淆的。另外混淆會降低程式執行性能,所以是否需要做混淆得做評估。

總結

我覺得做好文件壓縮合併,簡單的變數名混淆就可以了,並不需要那麼徹底的混淆。即便是前端被人挖得清清楚楚,只要後端強勁也就沒問題了。所以當你想進行代碼混淆時候,想想是為了什麼,值不值得。

 

本文為原創文章,轉載請保留原出處,方便溯源,如有錯誤地方,謝謝指正。

本文地址 :http://www.cnblogs.com/lovesong/p/5185543.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 條件語句: if(exp)執行一句代碼 1 <script> 2 var x = 1 ; 3 if(x == 1 ) //當if判斷語句結果是true 或者 false 當判斷結果等於true的時候,執行一句語句 4 document.write("x真的等於1") //=>x真的等於1 5 </s
  • 三元運算符: 語法為 exp1? exp2:exp3 判斷 exp1是true 和 false 如果true,則返回exp2 ,如果false ,則返回exp3 1 <script> 2 if(5>1){ 3 alert("true") 4 }else{ 5 alert("false") 6 } 7
  • 1,創建函數的方式;2,遞歸的方法;3.閉包。4,this對象;5.私有作用域;6,私有變數;7,特權方法
  • 比較運算符: > 、>= 、<、 <=、 ==、 !=、 ===、 !==、 比較運算符的結果都為布爾值 ==只比較值是否相等 而 ===比較的是值和數據類型都要相等 1 <script> 2 var a = 5,b = 10; 3 alert(a>b) //=>false 4 alert(a>=b
  • 有前輩說過,在JavaScript中,一切皆對象。由此可見,作為JavaScript的核心之一,對象是有多麼重要。雖然今天走親戚有點累,但還是得寫寫這個對象,免得吃幾天好的,就又忘光了。 1.創建對象 通過內置對象創建: var obj1 = new Object(); typeof obj1; /
  • 表單標簽在網站中主要負責的是進行與用戶間的交互, 如果沒有了交互, 那麼網站就只是一個展示, 會死氣沉沉的. <form>表單標簽 <form>表單標簽可以把瀏覽者(也就是我們用戶自己)輸入的數據傳送到伺服器端, 這樣伺服器程式就可以處理表單傳過來的數據, 完成與用戶的交互, 在任何的開發中, 交互
  • javascript面向對象的程式設計-創建對象;理解對象、屬性、方法、引用類型、基本類型、原型模式;創建對象的幾種方法。
  • 強制轉換為布爾類型: 1 <script> 2 var text =Boolean(0) //=>以下轉換的類型都為false 3 text = Boolean(0.0) 4 text = Boolean(-0) 5 text = Boolean(0/0) 6 text = Boolean(NaN)
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...