使用python完成對http請求的響應及一些安全策略
使用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可以參考這個部落格
-
資料傳輸加密
資料傳輸加密方式有很多種,我使用的就不公開了。