Avatar
1
Quốc Hưng Hoàng Beginner
Lưu trữ text with formatting trong database
Chào anh Dũng,

Hiện tại em đang làm 1 project mà ở đó người dùng có thể soạn văn bản kèm format (in đậm, in nghiêng, hyperlink, hình ảnh v.v...) để gửi mail.

Trong project có tính năng là người dùng có thể tuỳ chỉnh signature của họ (tương tự signature của gmail, nằm cuối cùng trong 1 nội dung mail).

Hiện em ko chắc mình sẽ lưu signature này như thế nào. Theo suy nghĩ của em là phía frontend sẽ dùng 1 markup language (như markdown) để convert các định dạng (in nghiêng, in đậm, hyperlink) để trở thành 1 chuỗi string thuần.

Vì vậy em có hỏi cấp trên (TA) là system sẽ dùng markup language gì để khi nhận đc input từ frontend, backend sẽ biết đc đó là định dạng gì (thay vì ghi nhận là các kí tự đặc biệt).

Phía backend cũng cần biết vì có những tính năng backend sẽ trực tiếp gửi mail đến người dùng ạ (ví dụ reset password)

Sau khi hỏi thì TA có bảo em là cứ lưu nguyên HTML code mà k cần convert gì hết. Em nghe thấy lấn cấn nhưng cũng k có lí do gì để phản biện lại. Nên trước mắt e vẫn làm theo yêu cầu đấy.

Xin anh Dũng cho em lời giải ạ.

  • Answer
mail mail template
Remain: 5
3 Answers
Avatar
tvd12 Beginner
tvd12 Beginner
Qua rất nhiều trình gửi mail và các dự án gửi mail thì anh thấy backend không cần phải biết nội dung mail đó là gì em ạ. Chỉ đơn giản là client sẽ submit HTML thuần lên server, server sẽ lưu lại nội dung hoặc gửi ngay tuỳ theo logic.

Tuy nhiên đa phần các dự án anh làm là sẽ có 1 bảng lưu mail template (cũng ở dạng html) và sau đó client gửi thì chỉ cần bổ sung các tham số, server sẽ thay thế các tham số tương ứng rồi gửi mail thôi.

Nói tóm lại, comment cấp trên của em là hoàn toàn hợp lý em ạ, em sẽ không cần phải convert bất kỳ cái gì cả, cứu lưu hoặc gửi luôn html mà client submit lên server là được.

Ví dụ đây là copyright của stackask này khi gửi mail:

&<span>copy</span>; 2021 <span>Stack</span> Ask. All Rights Reserved<<span>br</span>>Powered <span>by</span> <a href=<span>"https://youngmonkeys.org"</span> target=<span>"_blank"</span>>youngmonkeys.org</a>.

Em có thể thấy nó là html thuần thôi.

  • 2
  • Reply
Cho em hỏi thêm là ví dụ là Backend sẽ auto chạy 1 cron job vào 1 thời điểm nhất định trong ngày => gửi mail và ko cần ng soạn mail lúc gửi thì dùng các view engine sẽ dễ sửa đổi, tùy chỉnh các template hơn là dùng html thuần (dạng text) đúng ko a? ( cái này có thể gọi là 1 service chuyên để gửi mail a ạ )  –  Hihi 1660454783000
Anh thấy là như nhau em ạ, nó cũng chỉ là mấy cái biến kiểu ${username} hay phức tạp hơn tí là table thì cũng có vẻ không phức tạp lắm, tuy nhiên nếu dùng các engine thì có vẻ hỗ trợ tốt hơn đó em ạ, nó có cả vòng lặp, if else nên em quen cái gì thì dùng cái đó em ạ, đừng lăn tăn quá  –  dungtv 1660455113000
Avatar
chào anh Dũng,

Em có thắc mắc rằng nếu để client submit HTML  thuần như:

"<script>alert("!!!")</script>"

thì server sẽ vi phạm XSS attack.

còn nếu server escape các kí tự đặc biệt (<, >, ...) thì khi server gửi email (không thông qua client) thì phía bên email client (như Gmail) sẽ hiển thị đoạn HTML đó dưới dạng string.

Hiện tại hướng giải quyết của em: dùng regex để detect <script></script> pattern. Nếu ko tìm được -> ko escape các kí tự đặc biệt

Nếu tìm ra, escape chúng.

Rất mong phận đc sự hướng dẫn của a

  • 0
  • Reply
Nếu dùng spring thì có HtmlUtils. Còn không của apache lang cũng có stringescapeutils. Đỡ phải viết lại bạn nhé.  –  Thế Nguyễn 1668395809000
Avatar
monkey Beginner
monkey Beginner
Có 2 trường hợp:

  1. Nếu em cho phép client input cả html, thì có vẻ như cách "Hiện tại hướng giải quyết của em: dùng regex để detect <script></script>
pattern. Nếu ko tìm được -> ko escape các kí tự đặc biệt, nếu tìm ra, escape chúng" là phù hợp.

  1. Nếu em không cho phép client input html, thì em có thể escape toàn bộ cho đơn giản em ạ.
  • 0
  • Reply