Nginx
防止 Kubernetes 中 nginx 入口中的目錄遍歷
我定義了以下入口:
--- apiVersion: extensions/v1beta1 kind: Ingress metadata: name: someName namespace: test annotations: kubernetes.io/ingress.class: "ingress-public" nginx.ingress.kubernetes.io/affinity: "cookie" nginx.ingress.kubernetes.io/session-cookie-name: "JSESSIONID" nginx.ingress.kubernetes.io/connection-proxy-header: "keep-alive" nginx.ingress.kubernetes.io/server-snippet: | # block if not / or /test or /something if ($request_uri !~* "(^\/(?:(?:test|something)(?:\/|$)|$))") { return 404 ; break; } # redirect if proto_http if ($http_x_forwarded_proto = 'http') { return 301 https://$host$request_uri; break; } # hsts required header add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; spec: rules: - host: myhost.example.com http: paths: - path: / backend: serviceName: someservice servicePort: 80
正則表達式涵蓋了請求類似的大多數情況
/config
- 因為這與正則表達式不匹配,所以它返回 404。我目前有兩個問題。
- 請求
/test%2F..%2Fconfig
不會返回 404,即使這與正則表達式不匹配。- 請求
/test/..%2Fconfig
允許您到達/config
。那麼是否有更好的正則表達式可以涵蓋這些情況,或者有沒有辦法轉換
$request_uri
為絕對 uri,以便正則表達式可以處理它而不是編碼的 uri?正則表達式在這裡有一些測試案例:https ://regex101.com/r/Msu402/1
您可能想嘗試使用
location
( doc ) 或$uri
( doc ),因為兩者都匹配規範化的 URI。因為如果是邪惡的,我會建議一個位置(未經測試):location ~* ^/(?!test|something) { return 404; }
編輯:我重讀了你的問題,它應該阻止訪問正則表達式中提到的位置。所以我加了“不”…