ターンベースのビデオ ゲームのデータ転送の基礎として Pyramid を使用しています。クライアントは POST データを使用してアクションを提示し、GET を使用してシリアル化されたゲーム ボード データを取得します。ゲーム データには文字列が含まれることがありますが、ほとんどの場合、2 つの整数と 2 つのタプルです。
gamedata = (userid, gamenumber, (sourcex, sourcey), (destx, desty))
私の一般的なクライアント側フレームワークは、 Pickle 、base 64 への変換、urlencode の使用、および POST の送信でした。次に、サーバーは POST を受信し、単一項目のディクショナリをアンパックし、base64 をデコードしてから、データ オブジェクトをアンピクルします。
クラスや値が使えるのでPickleを使いたい。ゲーム データを POST フィールドとして送信しても、文字列しか得られません。
ただし、Pickle は安全ではないと見なされます。そこで、同じ目的を果たす pyYAML に目を向けました。を使用するyaml.safe_load(data)
と、セキュリティ上の欠陥を公開することなくデータをシリアル化できます。ただし、safe_load は非常に安全です。無害なタプルやリストは、たとえ整数しか含まれていなくても、逆シリアル化することはできません。
ここに中間点はありますか?任意のコードの実行を同時に許可せずに Python 構造をシリアル化する方法はありますか?
私が最初に考えたのは、値の名前にアンダースコアを使用してタプルを再作成する送信関数と受信関数のラッパーを作成することでした。たとえば、送信すると辞書の値が に変換source : (x, y)
されsource_0 : x, source_1: y
ます。私の 2 番目の考えは、それはあまり賢明な開発方法ではないということでした。
編集:これは JSON を使用した私の実装です... YAML や Pickle ほど強力ではないようですが、それでもセキュリティ ホールがあるのではないかと心配しています。
私が実験している間、クライアント側はもう少し目に見えて構築されました:
import urllib, json, base64
arbitrarydata = { 'id':14, 'gn':25, 'sourcecoord':(10,12), 'destcoord':(8,14)}
jsondata = json.dumps(arbitrarydata)
b64data = base64.urlsafe_b64encode(jsondata)
transmitstring = urllib.urlencode( [ ('data', b64data) ] )
urllib.urlopen('http://127.0.0.1:9000/post', transmitstring).read()
Pyramid Server はデータ オブジェクトを取得できます。
json.loads(base64.urlsafe_b64decode(request.POST['data'].encode('ascii')))
関係のない話ですが、この方法で POST データを使用することの許容性について他の意見を聞きたいです。現時点では、私のゲーム クライアントはブラウザー ベースではありません。