2016-09-12 6 views
0

は私が開き、TCPソケット上でリッスンPythonで書かれたシンプルなサーバーがあります。Pythonソケットサーバーへの不正な接続を防ぐにはどうしたらいいですか?

import socket 

server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind(("", 4242)) server_socket.listen(5) 

print("TCPServer Waiting for client on port 4242") 

while 1: 
    client_socket, address = server_socket.accept() 
    print("I got a connection from ", address) 
    while 1: 
     data = client_socket.recv(512) 
     if data: 
      print(data) 
     if not data: 
      print("Closed Connection") 
      break 

をし、それは素晴らしい作品!

私は今、疑問に残っています...自分のIPとポートを知っているルージュクライアントは、私のサーバーに接続できます。私のIPとポートが狂った安全でないとすれば...このTCPソケットに接続できる唯一のデバイスが自分のデバイスであることを確認するにはどうすればいいですか?

何らかのキーを作成できますか?それはSSLについてのことです、私はそれを理解するのに苦労しています。 SSLはちょうど傍受されないようにデータを保護しているようですが、だれでも私のリスナーに接続して書くことができますか?

ありがとうございます!

+0

さまざまな複雑さとセキュリティを備えた認証メカニズムが多数あります。あなたが使用するものは、どのような複雑さと必要なセキュリティがあるかによってます。その問題は広すぎる。しかし、他のプロトコル(HTTP、POP、SMTPなど)がどのようにこの問題を解決しているかを見てみることをお勧めします。プレーンテキストパスワード、ダイジェスト認証、クライアント証明書を使ったTLSです。 –

答えて

0

ここでSSLは必要ありません。 TSLとSSLはネットワーク上で暗号化された通信を提供するプロトコルなので、誰かがその通信を聞いていても理解できません。

受け入れる()メソッドは、あなたがアドレスはあなたと一致しない場合(任意のデータをreciveていない)、その接続をドロップすることを選択することができるタプル(CONN、アドレス)(https://docs.python.org/2/library/socket.html

を返します。 IPアドレス。

if address == your_ip 
    # receive data 

プログラム的にしたくない場合は、Linuxでは、iptablesのようなパケットフィルタリングツールを使用できます。

$ iptables -I INPUT -p tcp --destination-port 4242 -s <range_of_blocked_ip_addresses> -j DROP 
+0

ありがとう、問題は、接続デバイスが各接続(3Gモバイル接続)でIPアドレスを変更することです。別の方法がありますか?私はすぐには "パスワード"メッセージを送信しない各接続をドロップすることを考えていた...それはちょっと原油のようだ –

+0

あなたの3Gデバイスではどのようなアプリケーションを使用していますか?どのようにデータを接続して送信しますか?あなたはそれを次のレベルに持ち帰り、アプリケーションレベルで(自分のソケットで受け取ったデータを使って)自分のチャレンジレスポンス認証を実装することができると思います。このシナリオでは、秘密鍵を使用してデータを暗号化する必要があります。そうしないと、トラフィックを聞いている人がハンドシェイクを取得してデバイスを偽装する可能性があります。 – azavalla

関連する問題