1. 程式人生 > >限制IP訪問

限制IP訪問

本文以python為基礎

問題描述

後臺伺服器如何限制某些特定ip的訪問?

問題分析

如果對ip進行限制,那麼第一步就必須得到使用者的ip,才能進行限制,第二部才是限制

問題解決

得到使用者ip

首先,python提供了獲取ip的程式碼語句

ip = request.remote_addr 

但是通過這行程式碼,我們卻得到的不是使用者的真是ip,那麼是為什麼呢?不急,我們下來進行分析。

一般來說,應用程式都部署在nginx或者其他代理伺服器上,獲取更多層,利用nginx對使用者的請求進行分發,而request.remote_addr得到的是上一個節點的ip,因此在後臺程式中,我們也得到了nginx伺服器的ip,因此並不是客戶端的真實ip。

那麼如何得到使用者的真實ip呢?

python程式碼如下:

def get_client_ip(request):
try:
   real_ip = request.META['HTTP_X_FORWARDED_FOR']
   client_ip = real_ip.split(",")[0]
except:
   try:
       client_ip = request.META['REMOTE_ADDR']
   except:
       client_ip = ""
return client_ip

註解:程式碼中的HTTP_X_FORWARDED_FOR記錄了客戶ip到達後臺的全部ip過程,每經過一個伺服器節點,伺服器的ip都會加到這個頭的後面,這個ip的獲取是基於TCP,以‘,’隔開,因此當達到應用時,如果將這些ip調出來,頭部的那個ip即是客戶端的真實ip。

當然,這個HTTP_X_FORWARDED_FOR並不是呼叫就可以的,還必須在nginx上進行配置,否則得到的就是空

以下依照uwsgi的nginx為例

 server {
        listen       80;
        server_name  localhost;

        location / {
            include uwsgi_params;
            uwsgi_pass 127.0.0.1:5000;
            uwsgi_param UWSGI_CHDIR ***;
            uwsgi_param UWSGI_SCRIPT
run:app; #以下必加 uwsgi_param HTTP_X_FORWARDED_FOR $proxy_add_x_forwarded_for; uwsgi_param X-Real-IP $remote_addr; } }
限制ip

其實在獲取realip後,限制就較簡單了

  • 最實用的方法,直接防火牆限制ip
  • ip檢測,不符合條件的ip就無權訪問
  • 最不好的方法,是將限制ip放在資料庫中,這樣每次來都需要sql,記憶體、資源都消