Reviewing Security-Sensitive Code: Unchecked Input
Xavfsizlikka sezgir kodni ko'rib chiqish: tekshirilmagan kirish
Chegara nazoratchisini (customs officer) tasavvur qiling: u har bir yo'lovchining "men hech narsa olib o'tayotganim yo'q" degan so'ziga ISHONIB, hech kimning chamadonini tekshirmasa — chegara amalda YOPIQ emas, OCHIQ bo'lib qoladi. Yaxshi nazoratchi HAR BIR chamadonni, hatto eng "ishonchli ko'ringan" yo'lovchinikini ham tekshiradi. Xavfsizlikka sezgir kodda ham xuddi shunday: tashqaridan (foydalanuvchidan, tarmoqdan) kelgan HAR QANDAY ma'lumotga "ehtimol yaxshi niyat bilan yuborilgan" deb ishonib bo'lmaydi.
Xavfsizlikka sezgir kodni ko'rib chiqish — oldingi darslardagi "besh toifa"dan farqli, QO'SHIMCHA nazar talab qiladi: bu yerda savol shunchaki "kod to'g'ri ishlaydimi" emas, balki "kimdir bu kodni ATAYLAB, YOMON niyat bilan chalg'itishga urinsa nima bo'ladi?"
func SearchUsers(db *sql.DB, name string) ([]User, error) {
query := fmt.Sprintf(
"SELECT id, name FROM users WHERE name LIKE '%%%s%%'",
name,
)
rows, err := db.Query(query)
// ...
}Bu kod "baxtli yo'l"da (oddiy ism kiritilganda) to'g'ri ishlaydi. Lekin name — foydalanuvchidan kelgan, TEKSHIRILMAGAN matn, va u to'g'ridan-to'g'ri SQL so'roviga fmt.Sprintf orqali QO'SHILGAN. Agar kimdir name sifatida ' OR '1'='1 kabi maxsus tuzilgan matn yuborsa, bu SQL so'rovining MA'NOSINI butunlay o'zgartirib yuborishi mumkin — bu SQL in'ektsiyasi (SQL injection) deb ataladigan, eng xavfli va eng keng tarqalgan xavfsizlik teshiklaridan biri.
- •Xavfsiz yechim —
fmt.Sprintfbilan so'rov QURISH o'rniga,db.Query("SELECT id, name FROM users WHERE name LIKE ?", "%"+name+"%")kabi PARAMETRLANGAN so'rov ishlatish — bu holdanamening ICHIDAGI matn HECH QACHON SQL buyrug'i sifatida talqin qilinmaydi, u faqat QIYMAT sifatida ko'riladi - •Learn database/sql kursida ko'rgan
?(yoki$1) belgisi — aynan shu xavfsizlik uchun mo'ljallangan, va u DEYARLI har doimSprintforqali qo'lda so'rov qurishdan afzal - •Umumiy qoida: agar foydalanuvchi kiritgan matn to'g'ridan-to'g'ri BUYRUQ (SQL, shell buyrug'i, fayl yo'li) ichiga QO'SHILSA, bu deyarli har doim in'ektsiya xavfini keltirib chiqaradi
Xavfsizlikka sezgir kodni ko'rib chiqishda foydali savollar: "bu qiymat QAYERDAN keladi — foydalanuvchidanmi, tashqi API'danmi?" (agar ha bo'lsa, unga ISHONMANG); "bu qiymat qayerga BORADI — SQL so'roviga, fayl yo'liga, shell buyrug'iga?" (agar shunday joyga borsa, u PARAMETRLASHTIRISH yoki TOZALASH orqali himoyalanishi kerak).
Bu turdagi review izohi — Blocking Comments vs. Nitpicks darsidagi ma'noda DEYARLI HAR DOIM to'sib qo'yuvchi (blocking): xavfsizlik teshigi "kelajakda tuzatamiz" deb qoldirilishi mumkin bo'lgan narsa emas, chunki uni ATAYLAB qidirib topadigan tomon (hujumchi) mavjud — bu Technical Debt darsida ko'rgan "eng yomon holatda tizim ishdan chiqadi" toifasiga kiradi.
Key Takeaway
Key Takeaway:
Tashqaridan kelgan HAR QANDAY ma'lumotga ishonmang — u qayerdan kelayotganini va qayerga (SQL, fayl yo'li, buyruq) borayotganini kuzating. Foydalanuvchi kiritgan matn to'g'ridan-to'g'ri buyruq ichiga qo'shilsa, bu in'ektsiya xavfini keltirib chiqaradi va deyarli har doim to'sib qo'yuvchi muammo hisoblanadi.
NEXT UP
What Makes a Review Actually Useful