アクション メニュー項目をセキュリティ保護する

Shotgun では、サイトでアクションをカスタマイズできるように アクション メニュー項目(AMI)を作成できます。 AMI はサイト全体に配置したり、エンティティごとに使用したりできます。

AMI をセキュリティ保護するには、「Secret Token」フィールドを使用します。

シークレット トークンを設定する

シークレット トークンにより、AMI にセキュリティ レイヤが追加されます。 各 AMI にシークレット トークンを設定できます。

注: シークレット トークンを設定できるのは一度だけですが、設定後は、Web または API から表示することができません。

Shotgun のペイロードを検証する

シークレット トークンを設定すると、Shotgun はアクション サーバに送信される各要求とともにこのトークンを使用してハッシュ署名を作成します。

このハッシュ署名は、要求の送信前に要求のペイロードに追加されます。

注: AMI がセキュアな場合は、ハッシュ署名が Shotgun とアクション サーバで一致します。

次に、受信した要求を検証するように Python で記述されたアクション サーバの例を示します。

from BaseHTTPServer import BaseHTTPRequestHandler
import cgi
import hashlib
import hmac
import datetime
 
key = 'test_key'
 
class PostHandler(BaseHTTPRequestHandler):
 
    def do_POST(self):
        # Parse the form data posted
        form = cgi.FieldStorage(
                fp=self.rfile,
                headers=self.headers,
                environ={'REQUEST_METHOD':'POST',
                         'CONTENT_TYPE':self.headers['Content-Type'],
                         })
 
        # Validate the signature
        if not 'signature' in form.keys():
            print "==> Request not signed."
            return
 
        sorted_params = []
        # Echo back information about what was posted in the form
        for field in form.keys():
            if field != "signature":
                sorted_params.append("%s=%s\r\n" % (field, form[field].value))
 
        sorted_params.sort()
        string_to_verify = ''.join(sorted_params)
 
        signature = hmac.new(key, string_to_verify, hashlib.sha1).hexdigest()
        print "signature: %s" % form['signature'].value
        print "signature: %s" % signature
 
        if form['signature'].value == signature:
            print "==> Signatures match. This request was not tampered with!"
 
        now = datetime.datetime.utcnow();
        request_time = datetime.datetime.strptime(form['timestamp'].value, "%Y-%m-%dT%H:%M:%SZ")
        delta = (now -  request_time).total_seconds()
 
        if delta > 10:
            print "==> This request is getting old (%d seconds). Is it a replay attack?" % delta
        return
 
if __name__ == '__main__':
    from BaseHTTPServer import HTTPServer
    server = HTTPServer(('localhost', 8009), PostHandler)
    print 'Starting server, use  to stop'
    server.serve_forever()
フォローする

0 コメント

ログインしてコメントを残してください。