2008-09-09 11 views
20

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ì?

Trả lời

14

Bạn đã có ba lựa chọn:

  1. Tạo một server side proxy script.
  2. Tạo tập lệnh từ xa để đọc trong HTML động từ xa. Sử dụng thư viện như jQuery để làm việc này dễ dàng hơn. Bạn có thể sử dụng load function để tiêm HTML khi cần. CHỈNH SỬA Ý nghĩa ban đầu của tôi là ví dụ # 2 được sử dụng JSONP, yêu cầu tập lệnh phía máy chủ để nhận ra "callback =?" param.

  3. Sử dụng client side Flash proxy và thiết lập tệp crossdomain.xml trên gốc web của máy chủ.

+0

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. –

+0

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 –

1

Cá nhân, tôi sẽ gọi đến tên miền khác trên máy chủ và nhận và phân tích dữ liệu ở đó để sử dụng trong trang của bạn. Bằng cách đó bạn tránh bất kỳ vấn đề nào và bạn có được sức mạnh của ngôn ngữ/nền tảng phía máy chủ để nhận và phân tích dữ liệu.

Không chắc rằng sẽ làm việc cho kịch bản cụ thể của bạn ... khó có thể biết ngay cả với mô tả dài dòng của bạn ...

0

Tôi đã xem qua số YDN server side proxy script trước đó. Nó nói nó được xây dựng để làm việc với các API tìm kiếm của Yahoo.

Ứng dụng có hoạt động với bất kỳ miền nào không, nếu bạn chỉ cần cắt mã API của Yahoo ra? Hay bạn cần thay thế nó bằng tên miền bạn muốn nó hoạt động?

1

Bạn có thể thử easyXDM, bằng cách bao gồm rất ít mã, bạn có thể chuyển dữ liệu hoặc cuộc gọi phương thức giữa các tài liệu của các miền khác nhau.

0

nội dung từ xa iframe có thể được truy cập bằng javascript cục bộ.

Máy chủ từ xa chỉ cần đặt document.domain của trang.

Ví dụ:

Site A chứa iframe với src='Site B/home.php'

home.php trông như thế này:

[php stuff]...[/php] 
[script type='text/javascript']document.domain='Site A'[/script]