首頁 » 面試題庫 » 後端 » 中級(Intermediate) – 後端工程師面試問題彙總-20240515

最近OpenAI推出了GPT-4o模型,用AI整理了些後端工程師在技術面試時可能會遇到的問題。依等級分為入門級(Beginner)、初級(Junior)、中級(Intermediate)及高級(Senior),也有分散式任務及身份驗證機制專章。答案僅供參考,請搭配其他資料服用。

中級(Intermediate)

1. 如何在Django中配置URL路由?

  • 在Django中,URL路由由urls.py文件配置。每個Django應用都應該有一個urls.py文件,主應用的urls.py文件會包含所有應用的路由。
  • 基本步驟
    1. 在應用的目錄下創建或打開urls.py文件。
    2. 引入必要的模塊,如from django.urls import path和相對應的視圖(views)。
    3. 使用path()函數定義URL模式。
    4. 在主應用的urls.py中,包括應用的URL。
# hello_world_app/urls.py
from django.urls import path
from . import views

urlpatterns = [
    path('', views.index, name='index'),
]

# project/urls.py
from django.contrib import admin
from django.urls import include, path

urlpatterns = [
    path('admin/', admin.site.urls),
    path('hello/', include('hello_world_app.urls')),
]

2. 請詳細描述什麼是JWT(Json Web Token),它的主要優點和應用場景是什麼?

  • JWT(Json Web Token)是一種基於JSON的開放標準(RFC 7519)用於在各方之間傳輸聲明。JWT主要用於身份驗證和信息交換。
  • 結構

JWT由三部分構成:標頭(header),荷載(payload)和簽名(signature),這三部分經過Base64編碼並用.連接形成一個字符串。

標頭:通常包含令牌類型(即JWT)和簽名算法(如HMAC SHA256)。

{
  "alg": "HS256",
  "typ": "JWT"
}

荷載:包含聲明(claims),即傳遞的信息,如用戶ID和過期時間。

{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

簽名:用於驗證信息未被篡改,使用頭部中指定的簽名算法和密鑰。

  • 優點
    • 無狀態:不用在服務器上保存會話信息,所有必要的信息都包含在令牌中。
    • 擴展性好:適合於分布式系統和微服務架構。
    • 安全性:使用簽名保護數據完整性,且可以加密。
  • 應用場景
    • 認證和授權:如OAuth2.0中作為訪問令牌。
    • 信息交換:在各方之間安全地傳遞信息。

3. 如何在Django中處理Middlewares?

  • Middlewares是Django中處理請求和響應的一系列系統,可用於請求預處理和後處理、用戶認證、Session處理、CORS、CSRF保護等。
  • 配置Middlewares
    1. 在設定檔案settings.py中添加或修改MIDDLEWARE列表。
    2. Middlewares會按照列表中的順序應用。
MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
  • 自定義Middleware
    1. 創建一個Middleware類,並實現__init__(), __call__(), process_view(), process_exception()等方法(視需要)。
    2. settings.pyMIDDLEWARE中添加自定義中間件的路徑。
# myapp/middleware.py
class CustomMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        # Request預處理
        response = self.get_response(request)
        # Response後處理
        return response

# settings.py
MIDDLEWARE = [
    ...
    'myapp.middleware.CustomMiddleware',
]

4. 請描述資料庫索引的作用,並簡單解釋如何在資料庫中創建索引。

  • 作用
    • 加速查詢:索引在查詢操作中能顯著提升性能。
    • 提升排序效率:索引可以優化ORDER BY操作。
    • 強制唯一性:唯一索引可以確保數據列的唯一性。
    • 幫助JOIN操作:索引用於多表查詢中的JOIN操作,減少數據搜索時間。
  • 創建索引:

在SQL中,使用CREATE INDEX語句創建索引。

CREATE INDEX idx_name ON table_name (column_name);

在Django模型中,使用Meta選項中的indexes來創建索引。

from django.db import models

class MyModel(models.Model):
    my_field = models.CharField(max_length=255)

    class Meta:
        indexes = [
            models.Index(fields=['my_field'], name='idx_my_field'),
        ]

5. 什麼是SQL Injection,如何防止這種攻擊?

  • SQL Injection是一種代碼注入的攻擊技術,攻擊者能將惡意SQL語句插入應用程序的輸入字段,進而對資料庫執行未經授權的操作。
  • 防止方法
    • 使用ORM:例如使用Django ORM,自動產生安全的SQL查詢。
    • 參數化查詢:使用參數化查詢或者預處理語句,避免直接將用戶輸入嵌入到SQL語句中。 cursor.execute("SELECT * FROM table WHERE column = %s", [user_input])
    • 輸入驗證和清理:對用戶輸入進行嚴格的驗證和清理,確保只接收預期格式的數據。
    • 最小化權限:確保應用程序僅使用執行所需操作的最小權限,避免使用高權限用戶連接到資料庫。
    • 使用存儲過程:在資料庫內部進行複雜的查詢和操作,減少SQL直接暴露在應用層。

6. 什麼是CORS(跨來源資源共享),如何在Django中解決CORS問題?

  • CORS(Cross-Origin Resource Sharing)是一種允許來自不同網域的請求資源共享的機制。默認情況下,瀏覽器會限制從一個網域向另一個網域發送請求。
  • 解決方法
    • 使用Django的第三方庫django-cors-headers
    1. 安裝該庫:pip install django-cors-headers
    2. settings.pyINSTALLED_APPS中添加該APP。
    3. settings.pyMIDDLEWARE中添加CorsMiddleware
    4. 設定允許的網域。
INSTALLED_APPS = [
    ...
    'corsheaders',
]

MIDDLEWARE = [
    ...
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
]

CORS_ALLOWED_ORIGINS = [
    "<http://localhost:3000>",
    "<https://example.com>",
]


One Reply to “中級(Intermediate) – 後端工程師面試問題彙總-20240515”

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *