mtchuyen / Golang-Tips

Tips in Golang programming
3 stars 2 forks source link

Golang - Basic - String #36

Open mtchuyen opened 1 year ago

mtchuyen commented 1 year ago

Bài toán: loại bỏ các chuỗi có khả năng gây ra lỗi XSS

XSS: Cross-site Scripting - Reflected

Cho phép kẻ tấn công chèn và thực thi javascript, làm thay đổi cấu trúc của website khác ban đầu, có thể đánh cắp được cookie.

Hầu hết các solution đưa ra đều sử dụng regexp nhưng có vẻ performance không tốt

Case 1:

Trường hợp đơn giản nhất: Remove all characters other than alphabets from string

https://www.geeksforgeeks.org/remove-characters-alphabets-string/

https://stackoverflow.com/questions/38554353/how-to-check-if-a-string-only-contains-alphabetic-characters-in-go

Case này chỉ giữ lại các char là chữ cái và số, còn thiếu các dấu "-", "_"

Cách này:

cu := "abc'+alert(0)+'abc"
ivdecode, re1 := url.QueryUnescape(cu)

dùng để loại bỏ 1 số Char của HTML

Case 2:

Có thể xử lý được trường hợp thiếu các dấu "-", "_" Giải pháp của peterSO trong link, có performance rất tốt: https://stackoverflow.com/questions/54461423/efficient-way-to-remove-all-non-alphanumeric-characters-from-large-text

func clean(s []byte) string {
    j := 0
    for _, b := range s {
        if ('a' <= b && b <= 'z') ||
            ('A' <= b && b <= 'Z') ||
            ('0' <= b && b <= '9') ||
            b == ' ' {
            s[j] = b
            j++
        }
    }
    return string(s[:j])
}

func BenchmarkPeterSO(b *testing.B) {
    for N := 0; N < b.N; N++ {
        b.StopTimer()
        bytShakespeare := []byte(strShakespeare)
        b.StartTimer()
        clean(bytShakespeare)
    }
}
strShakespeare := "shakespeare.100-0.txt"

Case 3: NewReplacer

https://levelup.gitconnected.com/multi-string-replace-in-golang-with-replacer-148d4173f439

https://blog.boot.dev/golang/replace-strings-golang/#example-4---high-performance-string-replacement

    cu := "abc'+alert(0)+'abc$alert#${jni"
    rcu := strings.NewReplacer(
        "'", "0",
        "(", "0",
        ")", "0",
        "+", "_",
        "$", "0",
        "{", "0",
        "}", "0",
    )
    cu3 := rcu.Replace(cu)
    fmt.Println(cu3)

Link test Code