對於一個項目來說,除了穩定性以及健壯性以外,還需要有較好的安全性,此篇博客簡單描述salesforce中關於安全性的一點小知識,特別感謝公司中的nate大神和鵬哥讓我學到了新得知識。
項目簡單背景:
假設有兩個sObject,分別是A和B。B是A的子sobject。表單中元素顯示的是B的相關字段,這些字段A中也全部包含。表單中包含了9個元素,點擊提交的時候需要分成4組校驗,每一組中只要有一個元素修改過,此組元素就需要全部按照特有的校驗規則校驗。此處的修改過代表輸入框中的內容和A中的內容不一致,則視為修改,並且表單中2組和3組有兩個字段涉及到用戶隱私,不允許通過<input type="hidden">傳遞到前台.且此校驗規則僅為前台校驗,用於用戶是否需要進行校驗字段進行提交。
分析:(第一種開發人員很容易想到,能解決但是效率低且影響性能)
1.最開始考慮的是通過visualforce自帶的remoting方式提交這兩個字段,通過Visualforce.remoting.Manager.invokeAction提交到后台指定的方法去比較A表記錄中的這兩個值,如果和B中相同則不用校驗2和3,如果有哪個不相同則在result中進行表單校驗處理。此種方式壞處為從校驗到提交需要請求兩次,影響性能。
2.將2組和3組涉及隱私的字段值通過某種加密或者簽名方式通過<input type="hidden"/>方式傳到前台,前台輸入框內容以同樣規則的加密方法進行加密,此種加密方法不可逆,比較兩個加密值,如果相等,則說明A和B中的值相等,不需要修改相應組塊。
做法:
此處參考的鏈接如下:
1.https://developer.salesforce.com/page/Apex_Crypto_Class
2.https://github.com/sytelus/CryptoJS
1.apex端:controller端對兩個字段值進行加密,加密可以選擇很多加密模式,這里選擇使用sha1方式,主要用到的類為Crypto,此類詳情參看API。
主要代碼:
1 Blob hashNumber = Crypto.generateDigest('SHA1',Blob.valueOf('the content you need to crypto')); 2 String hashNumberCrypto = EncodingUtil.convertToHex(hashNumber);
將hashNumberCrypto通過隱藏於傳到前台,則此字段可以作為A中字段進行比較
2.visualforce page端:主要通過SHA1的js庫對前台的輸入框內容進行加密,然后同隱藏於的A的字段進行比較
主要代碼:
1 var hash = CryptoJS.SHA1("前台取到的dom元素對應的value"); 2 console.log(hash.toString()); 3 //The hash you get back isn't a string yet. It's a WordArray object. 4 //When you use a WordArray object in a string context, 5 //it's automatically converted to a hex string.
通過hash.toString()值以及hashNumberCrypto對應的隱藏域的值比較便可以更加安全的保護用戶隱私同時解決用戶提出的問題。
總結:此篇主要基於信息安全考慮實現前台兩個sObject中相關字段校驗問題,主要用到的是Crypto類相關知識,詳情請查看對應的類的API,篇中有錯誤地方歡迎指正,有不懂的歡迎留言。