我一直在使用反引號撰寫查詢
const firstUser = await connection
.getRepository(User)
.createQueryBuilder("user")
.where(`user.id = '${id}'`)
.getOne();
但是在typeorm檔案中,示例是用冒號寫的。
const firstUser = await connection
.getRepository(User)
.createQueryBuilder("user")
.where("user.id = :id", { id: 1 })
.getOne();
所以我想知道使用反引號和冒號之間是否有任何區別。
任何見解將不勝感激。
謝謝。
uj5u.com熱心網友回復:
不要使用字串插值將值插入到 SQL 陳述句中
抱歉大喊大叫,但這很重要。
- 閱讀:https : //en.wikipedia.org/wiki/SQL_injection
- 然后這個:https : //xkcd.com/327/
當你這樣做時:
.where(`user.id = '${id}'`)
然后首先創建字串,然后將其傳遞給where()函式。這意味著如果id是123,那么它與:
.where(`user.id = '123'`)
這似乎很好。但如果id是123' OR 1=1--'
你現在得到這個:
.where(`user.id = '123' OR 1=1--'`) // Now returns ALL users!
這稱為SQL 注入,這是一個很大的安全問題。這非常非常糟糕。攻擊者可以更改您的查詢并訪問他們不應該訪問的資料,或更改記錄以授予他們管理員訪問權限,或其他各種非常糟糕的事情。它非常接近于為每個人提供對您的資料庫的完全讀/寫訪問權限。
這讓我們想到:
.where("user.id = :id", { id: 1 })
為了解決這個問題,你要求 TypeORM 為你輸入值,這可以正確地轉義攻擊者可能添加的任何值,因此輸入沒有可執行指令。
如果id是邪惡的東西,那么它會變成類似的東西:
.where(`user.id = '123\' OR 1=1--'`) // note the backslash
// (actual query may vary based on different databases)
在這里,TypeORM 通過轉義攻擊者插入的關閉引號來確保將 id 處理為值進行轉義。這使得獲取用戶提供的值并在您的查詢中使用它們是安全的。
總之,永遠不要將用戶提供的值直接插入到查詢中(真的應該是所有值,只是為了安全),并且始終使用查詢引數來確保值被正確擴展。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/336020.html
標籤:javascript sql 打字稿 后端 打字机
上一篇:SQL遞回查詢獲取部門代碼
