找回密碼
 註冊
搜索
查看: 255|回復: 0

[教學] Flask 防止 sql injection 注入的幾種方法

[複製鏈接]
發表於 前天 23:07 | 顯示全部樓層 |閱讀模式
Push to Facebook

Flask 防止 sql injection 注入

Flask 防止 sql injection 注入

以下是如何在 Flask 應用程式中使用我提到的一些安全措施的範例:

使用 HTTPS:要在 Flask 應用程式中使用 HTTPS,可以使用 NGINX 或 Apache 等反向代理伺服器來處理 SSL/TLS 加密。以下是 NGINX 的範例配置:
  1. server {
  2.     listen 443 ssl;
  3.     server_name example.com;

  4.     ssl_certificate /path/to/ssl/certificate.pem;
  5.     ssl_certificate_key /path/to/ssl/private_key.pem;

  6.     location / {
  7.         proxy_pass http://localhost:5000;
  8.         proxy_set_header Host $host;
  9.         proxy_set_header X-Real-IP $remote_addr;
  10.         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  11.         proxy_set_header X-Forwarded-Proto $scheme;
  12.     }
  13. }
複製代碼


2. 驗證輸入:若要在 Flask 應用程式中驗證輸入,您可以使用 WTForms 函式庫建立具有定義欄位和驗證規則的表單物件。以下是一個範例表單:

  1. from flask_wtf import FlaskForm
  2. from wtforms import StringField, PasswordField
  3. from wtforms.validators import InputRequired, Length

  4. class LoginForm(FlaskForm):
  5.     username = StringField('Username', validators=[InputRequired(), Length(min=3, max=30)])
  6.     password = PasswordField('Password', validators=[InputRequired(), Length(min=8, max=30)])
複製代碼

要使用表單,您可以在範本中呈現它並在視圖函數中處理提交:

  1. @app.route('/login', methods=['GET', 'POST'])
  2. def login():
  3.     form = LoginForm()
  4.     if form.validate_on_submit():
  5.         # Form is valid, process the submission
  6.         ...
  7.     return render_template('login.html', form=form)pyo
複製代碼

3. 使用 CSRF 保護:若要在 Flask 應用中使用 CSRF 保護,可以使用 Flask-WTF 擴充及其 csrf_protect 裝飾器。以下是一個使用 CSRF 保護的範例視圖函數:
  1. from flask_wtf.csrf import CSRFProtect

  2. csrf = CSRFProtect(app)

  3. @app.route('/submit', methods=['POST'])
  4. @csrf.exempt
  5. def submit():
  6.     # Process the form submission
  7.     ...
複製代碼


   
4. 使用已淨化的 HTML 輸出:若要淨化 Flask 應用程式中的 HTML 輸出,您可以使用 Bleach 函式庫。以下是如何淨化使用者提交的 HTML 的範例:

您可以使用 Bleach 函式庫來清理 Flask 應用程式中的 HTML 輸出:

4.1 首先,使用 pip 安裝 Bleach 函式庫:
  1. pip install bleach
複製代碼

4.2 接下來,定義一個函數來淨化 HTML。函數應該將 HTML 作為輸入,並傳回淨化後的 HTML 作為輸出。以下是一個範例函數,它只允許使用有限的一組標籤和屬性:

  1. import bleach

  2. def sanitize_html(html):
  3.     # Allow only a limited set of tags and attributes
  4.     allowed_tags = ['a', 'b', 'i', 'em', 'strong']
  5.     allowed_attributes = {'a': ['href']}
  6.     return bleach.clean(html, tags=allowed_tags, attributes=allowed_attributes)
複製代碼

4.3 若要使用 sanitize_html 函數,您可以將使用者提交的 HTML 傳入該函數,然後再渲染至範本中。以下是一個執行此操作的範例視圖函數:

  1. @app.route('/submit', methods=['POST'])
  2. def submit():
  3.     # Get the user-submitted HTML
  4.     html = request.form['html']
  5.    
  6.     # Sanitize the HTML
  7.     sanitized_html = sanitize_html(html)
  8.    
  9.     # Render the sanitized HTML in a template
  10.     return render_template('view.html', html=sanitized_html)
複製代碼

5. 使用 Web 應用程式防火牆:若要在 Flask 應用程式中使用 Web 應用程式防火牆 (WAF),您可以使用啟用了 WAF 模組的反向代理伺服器,例如 NGINX 或 Apache。以下是啟用了 modsecurity WAF 模組的 NGINX 的範例配置:

  1. server {
  2.     listen 80;
  3.     server_name example.com;

  4.     location / {
  5.         modsecurity on;
  6.         modsecurity_rules_file /path/to/modsecurity/rules.conf;
  7.         proxy_pass http://localhost:5000;
  8.         proxy_set_header Host $host;
  9.         proxy_set_header X-Real-IP $remote_addr;
  10.         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  11.         proxy_set_header X-Forwarded-Proto $scheme;
  12.     }
  13. }
複製代碼

6. 保持應用程式及其相依性的更新:為了保持應用程式及其相依性的更新,您可以使用 pip 之類的工具來管理 Python 軟體包。若要更新專案中的所有軟體包,您可以執行以下命令:

  1. pip install -U -r requirements.txt
複製代碼

這會將 requirements.txt 檔案中列出的所有套件更新為最新版本。



https://python.plainenglish.io/the-best-security-practice-of-your-flask-application-api-691a21e37c27
您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則

Archiver|手機版|小黑屋|TShopping

GMT+8, 2025-10-24 03:21 , Processed in 0.026110 second(s), 24 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回復 返回頂部 返回列表