Trong khi kịch bản cross-site thường được coi là tiêu cực, tôi đã gặp phải một số tình huống cần thiết.Thực hành tốt nhất: Viết kịch bản Cross-Site hợp pháp
Gần đây tôi đã làm việc trong phạm vi giới hạn của một hệ thống quản lý nội dung rất hạn chế. Tôi cần bao gồm mã cơ sở dữ liệu trong trang, nhưng máy chủ lưu trữ không có bất kỳ thứ gì có thể sử dụng được. Tôi thiết lập một vài kịch bản xương trần trên máy chủ của riêng mình, ban đầu nghĩ rằng tôi có thể sử dụng AJAX để nhập nội dung của tập lệnh trực tiếp vào mẫu của CMS (do đó giữ lại hình ảnh động, mục menu, CSS, v.v.). Tôi đã sai.
Do các giới hạn của XMLHttpRequest
đối tượng, bạn không thể lấy nội dung từ một miền khác. Vì vậy, tôi nghĩ rằng iFrame - mặc dù tôi không phải là một người hâm mộ của khung hình, tôi nghĩ rằng tôi có thể tạo một khung phù hợp với chiều rộng và chiều cao của nội dung, để nó sẽ xuất hiện bản địa. Một lần nữa, tôi đã bị chặn bởi "bảo vệ". Trong khi tôi thực sự có thể tải một tệp từ xa vào iFrame, tôi không thể thực thi JavaScript để sửa đổi kích thước của nó trên trang lưu trữ hoặc bên trong trang được tải.
Trong trường hợp cụ thể này, tôi không thể trỏ tên miền phụ vào máy chủ của mình. Tôi cũng không thể tạo tập lệnh trên máy chủ CMS có thể proxy nội dung từ máy chủ của tôi, vì vậy suy nghĩ cuối cùng của tôi là sử dụng JavaScript từ xa.
JavaScript từ xa hoạt động. Nó phá vỡ khi người dùng đã tắt JavaScript, đó là một nhược điểm; nhưng nó đã có tác dụng. "Vấn đề" tôi gặp phải khi sử dụng JavaScript từ xa là tôi phải sử dụng hàm JS document.write()
để xuất nội dung bất kỳ. Bất kỳ đầu ra nào không phải là JS gây ra lỗi tập lệnh. Ngoài việc sử dụng document.write()
cho mỗi dòng, bạn cũng phải đảm bảo rằng nội dung được thoát - nếu không bạn sẽ gặp phải nhiều lỗi tập lệnh hơn.
Giải pháp của tôi là như sau:
Kịch bản của tôi đã nhận một tham số GET ("trang") và sau đó đã tìm kiếm các tập tin ({$page}.php
), và đọc nội dung vào một biến. Tuy nhiên, tôi phải sử dụng các kỹ thuật đệm khó xử để thực thi các kịch bản được bao gồm (đối với những thứ như tương tác cơ sở dữ liệu) sau đó loại bỏ nội dung cuối cùng của tất cả các ký tự ngắt dòng (\n
). Kết quả cuối cùng là kịch bản gốc của tôi (xuất ra JavaScript) truy cập các script "chuẩn" trên máy chủ của tôi và chuyển đổi đầu ra tiêu chuẩn của chúng sang JavaScript để hiển thị trong mẫu CMS.
Trong khi giải pháp này hoạt động, có vẻ như có thể có cách tốt hơn để thực hiện điều tương tự. Cách tốt nhất để làm cho tập lệnh cross-site hoạt động đặc biệt cho mục đích bao gồm nội dung từ một miền hoàn toàn khác là gì?
Xin làm rõ # 2? Đối với dataType 'html', như trong load(), jQuery sử dụng XMLHttpRequest, mà không hoạt động cross-site. Ngoài ra, load() sẽ loại bỏ các thẻ script. –
Xin lỗi, ý tôi là số 2 đang sử dụng JSONP http://docs.jquery.com/Release:jQuery_1.2/Ajax#Cross-Domain_getJSON_.28using_JSONP.29 –