[Kotlin, Spring Boot] จะลบบางอย่างออกจาก log เช่น password, token เพราะไม่อยากให้เห็น และไม่ควรเก็บไว้

Wasith T. (Bai-Phai)
กูโค้ด
Published in
1 min readMar 8, 2020

มันเกิดจากอุบัติเหตุในการหาวิธีการของ blog ที่แล้ว ที่มีความต้องการจะเข้าหรัาแค่บางส่วน และอยากรู้ว่าเราจะเอาออกได้ไหมเผื่อมี member หรือ properties ที่ไม่ต้องการเก็บไว้เช่น password, token

genact — A nonsense activity generator, https://github.com/svenstaro/genact

ย้อนกลับไปอ่าน blog ก่อนหน้า https://medium.com/@phai/1644d6c0f2fc เพราะบางเรื่องไม่ได้เขียนซ้ำใน blog นี้

Implement

จากตอนแรกที่เรามีแค่ Views.Secure ที่ไว้ระบุว่า properties ต่อไปนี้เราจะเข้ารหัา วันนี้เรามาเพิ่ม Views.Secret แยกกันให้ดีนะชื่อคล้ายกันมาก Secure, Secret

seal class Views {
seal class Secure
seal class Secret
}

แล้วก็ไปใส่ไว้ที่ field นั้น ๆ ว่า @JsonView(Views.Secret::class)

data class Login {  val username: String
@JsonView(Views.Secret::class)
val password: String
}

ไปดูที่ configs จะเห็นว่าสั่งให้เขียนแค่ Views.Secure ไว้เท่านั้น เพราะฉะนั้น JsonView ตัวอื่น ๆ ก็จะไม่ถูกเขียนลง log

@Configuration
class SecureWriterConfig {
@Bean
fun secureWriter(mapper: ObjectMapper): ObjectWriter {
return mapper
.writerWithView(Views.Secure::class.java)
}
}

เท่านี้อะไรที่ไม่ควรลง log เช่น token, password ก็หายออกไปจาก log แล้ว หรือถ้าต้องการ override เป็นค่าว่าง ก็ทำได้ที่ JsonSerializer เช่นกัน

class SecretJsonSerializer: JsonSerializer<String>() {

override fun serialize(
value: String,
gen: JsonGenerator,
provider: SerializerProvider
) {
if (provider.activeView == Views.Secret::class.java) {
gen.writeString("ไม่ให้ดูหรอก ความลับลูกค้า")
} else {
gen.writeString(value)
}
}
}

เป็นอย่างไรกันบ้างครับ อย่าลืมตรวจเชคดีว่า เรา log สิ่งไม่ควร log หรือไม่

ข่าวที่เกี่ยวข้อง

แต่อย่ากังวลไป ทั้ง Facebook, และ Twitter ก็เคยทำพลาดจุดนี้มาแล้ว

ถ้าเราเจอแบบนี้ในระบบให้ทำการปิดช่องโหว่นี้ ลบส่วนที่ไม่ควรจะเก็บออกไป และทำการแจ้งผู้ใช้งานให้ทรายถึงผลกระทบ และแนะนำให้ผู้ใช้งานเปลี่ยนรหัสผ่านด้วย

--

--

Wasith T. (Bai-Phai)
กูโค้ด

ตบมือเป็นกำลังใจให้ผมด้วยนะครับ 😘