保护您的动作菜单项

在 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 评论

登录写评论。