Đôi khi, phía máy chủ sẽ tạo chuỗi được nhúng trong mã JavaScript nội tuyến. Ví dụ, nếu "UserName" nên được tạo ra bởi ASP.NET. Sau đó, nó trông giống như.Có cần phải "thoát" ký tự "<" and ">" cho chuỗi javascript không?
<script>
var username = "<%UserName%>";
</script>
Đây không phải là an toàn, bởi vì người dùng có thể có/tên của mình là
</script><script>alert('bug')</script></script>
Đó là XSS lỗ hổng.
Vì vậy, về cơ bản, mã nên được:
<script>
var username = "<% JavascriptEncode(UserName)%>";
</script>
gì JavascriptEncode làm là thêm charater "\" trước khi "/" và "'" và "" "Vì vậy, html đầu ra. cũng giống như var username = "</script> alert (\ 'lỗi \') </script> </script>";.
Trình duyệt sẽ không giải thích "</script> "dưới dạng kết thúc khối tập lệnh. Vì vậy, XSS trong tránh.
Tuy nhiên, vẫn còn "<" và ">" ở đó. Nó được đề nghị để thoát khỏi hai nhân vật là tốt. Trước hết, tôi không tin rằng nên thay đổi "<" thành "& lt;" và ">" đến "& gt;" đây. Và, tôi không chắc chắn thay đổi "<" thành "\ <" và ">" thành "\>" có thể nhận biết được đối với tất cả các trình duyệt. Có vẻ như không cần phải mã hóa thêm cho "<" và ">".
Có đề xuất nào về điều này không?
Cảm ơn.
Nhưng vẫn còn '>' trong ']]>' bên trong khối CDATA phải được thay thế bằng '>'. Vì vậy, 'foo [bar [0]]> 1234' phải được thay thế bằng' foo [bar [0]] < 1234' hoặc 'foo [bar [0]]> 1234'. Nếu không, khối CDATA sẽ bị đóng sớm. – Gumbo
Vì CDATA hiển thị ký tự là "&" chứ không phải "Bắt đầu thực thể" - điều đó sẽ không hoạt động. Nếu bạn cần đại diện cho chuỗi "]]>" bên trong CDATA thì tôi chắc chắn bạn đang hút và nên sử dụng các thực thể để bắt đầu (bên ngoài khối CDATA) – Quentin
Hoặc chỉ cần thêm một dấu cách: 'foo [bar [0 ]]> 1234' - hoặc nếu là một phần của chuỗi: ''foo [bar [0]]' + '> 1234'' - hoặc chỉ chứa tất cả tập lệnh của bạn trong tệp .js bên ngoài. – gnarf