我最初發現這是一個問題,當我試圖搜索前綴爲hashtag的術語時,結果證明它是SQL中的註釋分隔符。搜索沒有返回任何內容,因爲它忽略了標籤後面出現的#term。如何編寫參數化的sql查詢以防止SQL注入?
所以現在我很難找到逃避用戶輸入的正確方法。在我看來,這將解決hashtag問題,並解決更大的問題,SQL注入。
這裏是我與具體工作的片段:
function (term) {
term = term.toLowerCase()
return db('ticket')
.select('*')
.where(db.raw('lower(question)'), 'like', `%${term}%`)
.orWhere(db.raw('lower(note)'), 'like', `%${term}%`)
.orWhere(db.raw('lower(user_name)'), 'like', `%${term}%`)
}
我發現this和this SO文章,似乎接近,以及其他幾件事情。此外,Knex的文檔和其他資源建議將參數化綁定作爲防範SQL注入的一種方法。
我只是無法找到一個清晰的例子,可以通過JavaScript或使用Knex向我解釋。
您的數據庫整理是否區分大小寫?您不需要在'LIKE'運算符中使用'LOWER' - 這也意味着您的查詢將運行得非常緩慢,因爲它不能使用索引。 – Dai
IMO。 「SQL注入」就像「問題2000」:很多噪音,但沒有嚴重。有兩條簡單規則可以避免任何「SQL注入」:1)在前端/中端使用參數化查詢和2)在DB對象上設置適當的DB級安全性。 – Abelisto
感謝您的回覆。 @Dai我嘗試了你的建議,但似乎區分大小寫。我對db land比較陌生,你能推薦一些資源來學習使用你提到的索引和排序規則嗎?從未聽過這些條款。 –