永遠不要相信前端傳來的數據,對于資深開發者而言,這幾乎是一種本能,無需過多解釋。然而,初入職場的開發新手可能會感到困惑:為何要對前端傳來的數據持有如此不信任的態度?難道人與人之間連基本的信任都不存在了嗎?
API惡意調用
?
這種“惡意調用”是實現 SQL 注入攻擊的一種常見途徑,它展示了攻擊者如何通過 URL 參數發起攻擊。
再來看一個例子,假設有一個用戶信息查詢接口,前端會發送一個用戶 ID 到后端,后端根據用戶 ID 查詢用戶信息并返回。后端代碼如下(未采用防御式編程):
from flask import Flask, request, jsonify i
mport sqlite3 app = Flask(__name__) @app.route('/user', methods=['GET'])
def get_user(): user_id = request.args.get('id') conn = sqlite3.connect('example.db') cursor = conn.cursor() query = f"SELECT * FROM users WHERE id={user_id}" cursor.execute(query) result = cursor.fetchone() conn.close() if result: return jsonify(result) else: return jsonify({"error": "User not found"}), 404
if __name__ == '__main__': app.run(debug=True)
在這個例子中,后端代碼直接將用戶輸入的 user_id 拼接到 SQL 查詢語句中,沒有進行任何校驗或處理。這使得該接口容易受到 SQL 注入攻擊。
惡意調用示例:假設攻擊者通過瀏覽器或其他工具向該接口發送以下請求:
GET /user?id=1 OR 1=1
生成的 SQL 查詢語句將是:
SELECT * FROM users WHERE id=1 OR 1=1
由于 1=1 永遠為真,這條查詢語句會返回所有用戶的信息,而不是只返回 ID 為 1 的用戶信息。攻擊者可以利用這種方式獲取數據庫中所有用戶的信息,造成嚴重的安全問題。
由此可見,前端傳來的數據并非絕對可靠。對于后端來說,這些數據就像未經篩選的原材料,其中可能夾雜著各種風險。因此,后端必須對前端傳來的數據進行二次校驗,這正是防御式編程的核心思想。