H5 目前的技術已經趨於成熟。它開發週期短開發週期短,投入和維護成本低,兼容性好。根據需求,H5可以製作文字、圖形、音頻、視頻,因此可以用於PC網站、手機網站、微站、Web App、輕應用。而且由於最近AIGC的大火,它的製作成本變得更低。
H5的應用場景主要包括展示、營銷、調查、遊戲等等。
不過作為重要的移動互聯網服務載體,H5在給用户帶來便利體驗的同時,也讓企業面臨信息泄露、惡意劫持、薅羊毛等各類業務風險。
今天我們就來看看怎麼去防護H5。
常見業務風險
鏈接偽造風險。攻擊者通過偽造的H5網頁鏈接,入侵破壞業務系統乃至內網,竊取重要信息、賬户密碼等。
頁面篡改風險。H5網頁代碼遭篡改複製,做成釣魚頁面,盜取用户賬户密碼和信息等。
信息泄露風險。H5網頁被植入惡意代碼,盜取訪問者的賬號密碼、隱私信息等。
賬號破解風險。H5往往是App或小程序應用服務的延伸,與平台賬户體系關聯,很容易成為攻擊者盜取賬號、破解密碼的重要目標。
“薅羊毛”風險。通過H5網頁舉辦的各類優惠活動企業主要的拓客手段,“薅羊毛”不僅破壞了正常的營銷規則,白白消耗大量活動資金,更無法保障新註冊用户的精準性,導致營銷活動效果功虧一簣。
業務防護思路
我們主要從業務安全的角度來進行防護,具體包括以下幾個點(代碼只是簡單提供思路,僅供參考):
數據安全防護:因為H5業務中會涉及到用户數據的收集和存儲,因此必須採取嚴密的數據安全防護措施,例如數據加密、數據備份、訪問控制等。
- 數據加密示例代碼
import hashlib
import base64
# 數據加密函數
def encrypt(data):
# 對數據進行SHA256哈希處理
sha256 = hashlib.sha256()
sha256.update(data.encode('utf-8'))
hashed_data = sha256.digest()
# 對哈希後的數據進行Base64編碼處理
encoded_data = base64.b64encode(hashed_data)
# 返回加密後的數據
return encoded_data.decode('utf-8')
- 數據備份示例代碼
import shutil
# 數據備份函數
def backup_data(src_path, dst_path):
# 使用shutil庫的copytree函數進行數據備份
shutil.copytree(src_path, dst_path)
print('數據備份成功')
- 訪問控制示例代碼
# 用户列表
users = [{'username': 'admin', 'password': '123456'}, {'username': 'user1', 'password': 'password1'}]
# 登錄函數
def login(username, password):
# 遍歷用户列表進行登錄驗證
for user in users:
if user['username'] == username and user['password'] == password:
print('登錄成功')
return True
# 登錄失敗
print('登錄失敗')
return False
# 訪問控制裝飾器
def require_login(func):
def wrapper(*args, **kwargs):
# 判斷用户是否登錄
if 'username' in kwargs and 'password' in kwargs:
username = kwargs['username']
password = kwargs['password']
if login(username, password):
# 登錄成功,執行原函數
return func(*args, **kwargs)
# 用户未登錄,返回錯誤信息
return '請登錄後再進行操作'
return wrapper
# 需要進行登錄驗證的函數
@require_login
def secret_info():
return '這是一些秘密信息'
# 使用示例
if __name__ == '__main__':
# 備份數據
backup_data('/path/to/data', '/path/to/backup')
# 訪問受限的函數
print(secret_info(username='admin', password='123456'))
# 訪問受限的函數(未登錄)
print(secret_info())
網絡安全防護:H5業務通常涉及到數據傳輸和網絡交互,因此必須採取有效的網絡安全防護措施,例如SSL/TLS加密、防火牆、反向代理等。
簡單給一個SSL/TLS的代碼:
import socket
import ssl
# 服務器地址和端口號
server_address = ('localhost', 8888)
# 創建socket對象
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 將socket包裝成SSL socket
ssl_sock = ssl.wrap_socket(sock, ssl_version=ssl.PROTOCOL_TLSv1_2, ciphers='ECDHE-RSA-AES256-SHA384')
# 連接服務器
ssl_sock.connect(server_address)
# 發送數據
ssl_sock.sendall('Hello, World!'.encode())
# 接收數據
data = ssl_sock.recv(1024)
# 關閉連接
ssl_sock.close()
代碼安全防護:H5業務開發過程中需要編寫大量的代碼,因此必須採取有效的代碼安全防護措施,例如代碼審計、代碼加密、防禦XSS和CSRF等攻擊。
挨個來看看示例代碼:
- 代碼審計
# 漏洞代碼
def execute_sql(user_id):
sql = "SELECT * FROM users WHERE user_id='%s'" % user_id
cursor.execute(sql)
results = cursor.fetchall()
return results
# 修復代碼
def execute_sql(user_id):
sql = "SELECT * FROM users WHERE user_id=%s"
cursor.execute(sql, (user_id,))
results = cursor.fetchall()
return results
- 代碼加密
import py_compile
# 加密代碼
py_compile.compile('main.py')
# 運行加密後的代碼
import main
main.main()
- 防護XSS
<!-- 原始代碼 -->
<script>
var name = '{{ name }}';
document.write('Hello, ' + name + '!');
</script>
<!-- 修復後的代碼 -->
<script>
var name = '{{ name|escapejs }}';
document.write('Hello, ' + name + '!');
</script>
- 防護CSRF
# 原始代碼
@app.route('/transfer_money')
def transfer_money():
from_account = request.args.get('from_account')
to_account = request.args.get('to_account')
amount = request.args.get('amount')
# 轉賬操作
# 修復後的代碼
@app.route('/transfer_money')
def transfer_money():
from_account = request.args.get('from_account')
to_account = request.args.get('to_account')
amount = request.args.get('amount')
# 校驗Referer字段
referer = request.headers.get('Referer')
if referer and 'example.com' in referer:
# 轉賬操作
else:
abort(403)
結語
因為H5的開放的網絡環境、跨平台特性(H5應用可以運行在不同的操作系統和瀏覽器中,因此,對於黑客來説,他們可以選擇攻擊不同的平台和瀏覽器來獲取用户的信息和數據)以及H5應用的安全防護措施不足,導致H5極容易導致攻擊,所以在H5的防護上,要考慮諸多因素。
以上的示例僅供參考,前期的防護和後期的安全監控同樣重要,因此,也必須重點關注風控這塊。
以上。
業務安全產品:免費試用