Tornado Web 防止XSS攻擊,即對變量進行特殊字符過濾

網站開發使用Tornado做爲服務器,本覺得其自帶的對數據庫進行處理的方法(insert,update)等會自動對異常字符進行檢測,便沒有人工進行異常字符過濾。javascript

以後甲方請了專業的公司對網站進行了安全評估,發現大部分的input標籤均可以發起XSS攻擊,即在input中輸入<script>alert(1);</script>,存進數據庫以後再取出將會調用這段javascript代碼,有着很大的安全隱患。所以需對插入數據庫的變量進行字符檢測。html

在將數據插入數據庫以前,先進行字符替換。即先重寫一個get_escaped_argument方法,調用tornado自帶的xhtml_escape方法將如下這些字符進行轉義java

_XHTML_ESCAPE_DICT = {'&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', '\'': '&#39;'}
    def escape_string(self, s):
        return tornado.escape.xhtml_escape(s)

    def get_escaped_argument(self, key, default = None):
        if default is not None:
            return self.escape_string(self.get_argument(key, default))
        else:
            return self.escape_string(self.get_argument(key))

而後在寫rest接口時,調用以上的方法,就可將全部異常字符進行處理,避免了執行script腳本的問題。node

@Route(r"/rest/mgr/group/add")
class _(MgrHandler):
    @coroutinedef post(self):
        group_id = self.get_escaped_argument('group_id','')

 

從數據庫中取數據時,input裏面的數據顯示的是替換後的字符,所以重寫了jQuery,在val顯示以前先進行字符的替換。python

val: function(e) {            var n, r, i, o = this[0]; {
                if (typeof e == 'string') {
                    e = e.replace(/&lt;/g, "<");
                    e = e.replace(/&gt;/g, ">");
                    e = e.replace(/&quot;/g, '"');
                    e = e.replace(/&#39;/g, "'");
                }
                if (arguments.length) return i = x.isFunction(e), this.each(function(n) {
                    var o;
                    1 === this.nodeType && (o = i ? e.call(this, n, x(this).val()) : e, null == o ? o = "" : "number" == typeof o ? o += "" : x.isArray(o) && (o = x.map(o, function(e) {
                        return null == e ? "" : e + ""
                    })), r = x.valHooks[this.type] || x.valHooks[this.nodeName.toLowerCase()], r && "set" in r && r.set(this, o, "value") !== t || (this.value = o))
                });

                if (o) return r = x.valHooks[o.type] || x.valHooks[o.nodeName.toLowerCase()], r && "get" in r && (n = r.get(o, "value")) !== t ? n : (n = o.value, "string" == typeof n ? n.replace(V, "") : null == n ? "" : n)
            }
        }
    })

 同時可參考 http://demo.pythoner.com/itt2zh/ch6.html ,裏面有更爲詳細的tornado安全應用開發。 數據庫

相關文章
相關標籤/搜索