1. 程式人生 > 其它 >使用python完成對http請求的響應及一些安全策略

使用python完成對http請求的響應及一些安全策略

技術標籤:linux後端pythoncentos

使用python完成對http請求的響應及一些安全策略

Web主機配置

  • 阿里雲1核2G,1Mbps頻寬,CentOS 8.2 64位
  • Apache Web伺服器
  • 暫時還未完成域名備案以及SSL證書安裝

起源

最近和同學合作一款微信小程式,他負責前端,我負責後端。由於python比較容易上手,所以選擇python編寫後端程式。

由於我的Web主機域名尚未備案,故目前還不能使用https,更不能為微信小程式服務,域名備案後,此部落格還會更新。

後端完成的功能:

  • 完成對前端請求的響應
  • 防止資料洩露

我接觸後端只有幾天,所以可能裡面內容都是基礎或是基礎也算不上。有什麼不足和可以改進之處希望可以指出。也希望大神們不要攻擊我的伺服器。

安裝Web伺服器

我使用的Web伺服器為Apache,目前也有很多Nginx。Nginx在網站流量較高的場合更有優勢,而在我主機頻寬只有1Mbps下,兩者似乎差不大多。

yum install -y httpd	#安裝apache
systemctl start httpd	#啟動apache
chkconfig httpd on		#apache開機自啟動

開啟埠

首先在阿里雲控制檯中配置安全組規則,開放你想要開啟的埠。

安全組在控制檯左側選單->網路與安全->安全組,點進去,配置規則,開放你想要開放的埠。

如果你設定了firewall或者iptables,同樣也要在其中開放這個埠,或者直接關閉firewall和iptables。這裡以開啟80埠為例,列出了你可能需要用到的指令。

#關閉firewall
service firewalld stop
#firewall開放80埠
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --reload	#重新載入防火牆設定
#關閉iptables
service iptables stop
#iptable開放80埠
vim /etc/sysconfig/iptables	#開啟iptables配置檔案,在其中新增下面這行
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
service iptables restart	#重啟iptables

到此,你的伺服器就可以對http請求進行響應了。在/var/www/html/目錄下放入隨便從哪找來的index.html,再在你電腦的瀏覽器中輸入Web主機的公網ip,瀏覽器中便能顯示剛剛放在Web主機上的網頁了。

編寫Python程式

首先我們需要進入到/var/www/html/目錄下,啟動Apache後,該目錄將會對外公開。在這裡我們需要建立一個python檔案,用於實現後端功能。

cd /var/www/html/
mkdir port90	#建立一個目錄,避免和主頁檔案混在一起
cd port90
vim port90.py	#建立py檔案

在py檔案中寫入以下內容:

from http.server import HTTPServer, BaseHTTPRequestHandler
import json

class Resquest(BaseHTTPRequestHandler):
    def handler(self):
        print("data:", self.rfile.readline().decode())
        self.wfile.write(self.rfile.readline())
    def do_GET(self):
        if self.path != '/':
            self.send_error(404,'Page Not Find')
            return
        print('\n'+self.command)
        print(self.client_address)
        print(self.requestline)
        req_datas = self.rfile.read(int(self.headers['content-length'])).decode()
        print(req_datas)
        data = {
            'code': '200',
            'message': 'Success',
            'explain': ''
        }
        self.send_response(200)
        self.send_header('Content-type', 'application/json')
        self.end_headers()
        self.wfile.write(json.dumps(data).encode())
        
if __name__ == '__main__':
    host = ('', 90)
    server = HTTPServer(host, Resquest)
    print("Starting server, listen at: %s:%s" % host)
    server.serve_forever()

到此,你的伺服器就可以根據你的需求對http請求進行相應了。do_GET是對http的GET請求進行處理,其他還有POST請求,PUT請求,DELETE請求等等,對應的函式都是同樣的命名方式。

由於我們使用了另一個埠,因此我們需要重複上一步的操作,再開啟一個埠。

本地請求

為了方便後續除錯,建議在本地寫一個python程式用於發起請求。程式如下:

import http.client
import json
ip_port = ''	#這裡換成自己伺服器的域名:port或者ip:port
conn = http.client.HTTPConnection(ip_port)

data = 'test'
headers = {"Content-type":"text/html;charset=UTF-8"}
conn.request('GET', '/', data ,headers)
response = conn.getresponse()
content = response.read().decode()
print(content)

此程式的作用是向伺服器分別發起一次GET請求,並打印出響應。伺服器端執行python程式,本地再執行python程式便能檢視結果。

讓程式與視窗分離

雖然現在可以正常請求與響應,但是你會發現當你關閉終端時,python程式不再運行了,也就是說,你必須讓你的電腦與Web主機保持連線,否則python程式將會終止,伺服器不再可以根據你的想法對http進行相應。

這裡我們可以使用tmux,將會話與視窗分離,實現終端視窗關閉而程式仍在會話中繼續執行。

sudo yum install tmux	#安裝tmux
tmux new -s 'port90'	#建立名為port90的會話
python3 port90.py		#執行程式
#此時按Ctrl+b,鬆開後按d可分離會話

現在你就可以關閉ssh連線,本地執行剛剛的python程式,可以正常獲取伺服器的響應。

響應規範化

我們的伺服器是要為前端服務的,響應內容格式的規範化有助於前端除錯時更快找到錯誤原因。一般情況下響應分為這麼幾個部分:響應行、響應頭、響應體。具體可以看這個部落格

響應的規範化可以參考這篇文章

安全策略

目前伺服器尚未投入使用,但是我發現總有很多訪問記錄,我擔心資料洩露以及伺服器安全,故增加一些安全措施,儘可能避免這些問題。

  • 禁止境外ip訪問

    這一功能實現的主要方法依靠iptables,可以參照這個部落格

  • 檢查訪問路徑

    訪問我伺服器的大多是一些爬蟲,它們只會訪問固定的幾個路徑,我們只需判斷其訪問路徑是否合法,不合法則直接傳送404響應即可。

  • 限制訪問次數

    記錄一個ip在同一天內訪問的次數,大於次數則直接傳送錯誤響應。

  • 限制請求的字串長度

    還有很多後端的安全策略,應對各種攻擊,我的後端也會不斷完善。由於我在程式中使用了eval()函式,因此很怕傳入的字串中出現一些python語句,故限制字串長度。

  • 關鍵字檢查

    理由同上,這裡主要檢查如os,import等關鍵詞,出現則返回錯誤響應。

  • 資料中加入token

    關於token可以參考這個部落格

  • 資料傳輸加密

    資料傳輸加密方式有很多種,我使用的就不公開了。