2013-01-10 25 views
10

Tôi có biểu mẫu có hộp văn bản đăng dữ liệu lên tệp php sử dụng chức năng "htmlentities" để đảm bảo an toàn cho email tới chủ sở hữu trang web.PHP htmlentities không đủ để ngăn chặn tin tặc tiêm html từ biểu mẫu

Vấn đề là ai đó đã quản lý để nhận siêu kết nối trong văn bản và htmlentities() sẽ không xóa nó.

Đây là html textbox của tôi:

<input name="usertext" type="text" /> 

Đây là mã PHP của tôi tiếp nhận các dữ liệu sau (tôi rời mã email ra bởi vì đó không phải là vấn đề tôi đã thay đổi nó để chỉ echo dữ liệu nhận được như vậy. tôi có thể cố gắng để tái tạo những gì các hacker đã làm Nếu tôi biết làm thế nào ông đã làm điều đó, tôi có thể tìm thấy một cách để ngăn chặn nó xảy ra):.

echo trim(htmlentities($_POST["usertext"], ENT_QUOTES)); 

Bây giờ các hacker gửi một số dữ liệu và điều này là kết quả html (mã nguồn - điều đó có nghĩa là nó đã hiển thị một liên kết bình thường trong trình duyệt):

<a target="_blank" href="mailto:[email protected]">[email protected]</a> 

Tôi nghĩ rằng htmlentities() sẽ luôn ngăn mọi người không thể nhập html dưới bất kỳ hình thức nào. Nếu tôi nhập một siêu liên kết như:

<a href="aaa" /> 

tôi nhận được:

&lt;a href="aaa" /&gt; 

Nhưng văn bản của hacker không được mã hóa như thế.

Vì vậy, câu hỏi của tôi là:

  1. Làm thế nào mà các hacker nhập thẻ html để các htmlentities() chức năng đã không làm gì với nó?
  2. Làm cách nào để sao chép nó để thử nghiệm? (có thể được trả lời bởi câu hỏi trên)

Tôi đã thực hiện một số nghiên cứu và có thể tin tặc đã mã hóa văn bản của anh ấy bằng utf-7 hoặc gì đó?

Tôi đã nhận được một vài email có cùng các liên kết này. Hacker này rõ ràng đang kiểm tra trang web của tôi để xem liệu anh ta có thể làm XSS hay gì đó không.

+0

Đăng nhập yêu cầu thô với nội dung của trường $ _POST ["usertext"] khi được gửi. Bạn cũng có thể thêm mã hóa vào htmlentities phải khớp với mã hóa nội dung. – MatsLindh

+0

Bạn đã kiểm tra JavaScript được bao gồm ở đâu đó, có thể nó được tạo động? – martinstoeckli

+0

Bạn có mã hóa đúng nội dung html của mình trước khi gửi không? – inhan

Trả lời

4

Câu hỏi hay! Tôi nghĩ bạn có thể đọc số link giải thích sự cố này và đưa ra giải pháp.

Giải pháp được đề xuất là chỉ định cho trình duyệt (thông qua thẻ meta) mà bộ ký tự được sử dụng trong trang.

+0

Cảm ơn. Liên kết đó rất thú vị và có vẻ như hacker có thể đã sử dụng utf-7. Vấn đề duy nhất là khi tôi sao chép các ví dụ utf-7 vào hộp văn bản của tôi và gửi nó, trình duyệt chỉ hiển thị các ký tự chính xác và không chuyển đổi chúng thành các thẻ html. Dù sao, nó có vẻ là cách duy nhất mà hacker có thể làm. Tôi sẽ chỉ định utf-8 nơi tôi có thể ví dụ. (Php code) header ('Content-Type: text/html; charset = utf-8'); Điều đó có thể hiệu quả. Vì tôi không thể sao chép những gì mà hacker đã làm, tôi sẽ không bao giờ biết liệu nó có hoạt động cho đến khi anh ta thử lại không :) – Daniel

0

Đây không phải là giải pháp thanh lịch nhất, nhưng không nhìn thấy phần còn lại của mã, bạn có thể kiểm tra xem trường usertext có chứa chuỗi "href" hay không.

+0

Đó là một cách và tôi sẽ làm điều đó nếu không ai có thể tìm ra cách hacker đã vượt qua chức năng htmlentities – Daniel

0

Sẽ htmlspecialchars() làm các việc lừa? Điều này có nghĩa là article trên W3Schools.

Các vấn đề liên quan