網站開發使用Tornado做爲服務器,本覺得其自帶的對數據庫進行處理的方法(insert,update)等會自動對異常字符進行檢測,便沒有人工進行異常字符過濾。javascript
以後甲方請了專業的公司對網站進行了安全評估,發現大部分的input標籤均可以發起XSS攻擊,即在input中輸入<script>alert(1);</script>,存進數據庫以後再取出將會調用這段javascript代碼,有着很大的安全隱患。所以需對插入數據庫的變量進行字符檢測。html
在將數據插入數據庫以前,先進行字符替換。即先重寫一個get_escaped_argument方法,調用tornado自帶的xhtml_escape方法將如下這些字符進行轉義java
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(/</g, "<"); e = e.replace(/>/g, ">"); e = e.replace(/"/g, '"'); e = e.replace(/'/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安全應用開發。 數據庫