2010-05-06 23 views
30

Tôi đang phát triển một trang web cần hiển thị, trong khung nội tuyến, một báo cáo được phục vụ bởi máy chủ SharePoint của công ty khác. Họ là tốt với điều này.Làm cách nào tôi có thể bỏ qua tùy chọn khung hình X: Tiêu đề HTTP SAMEORIGIN?

Trang chúng tôi đang cố gắng hiển thị trong khung nội tuyến đang cung cấp cho chúng tôi tùy chọn X-Frame: SAMEORIGIN khiến trình duyệt (ít nhất là IE8) từ chối hiển thị nội dung trong khung.

Đầu tiên, đây có phải là thứ mà họ có thể kiểm soát hoặc là một cái gì đó mà SharePoint chỉ làm theo mặc định? Nếu tôi yêu cầu họ tắt nó đi, họ có thể làm được không?

Thứ hai, tôi có thể làm điều gì đó để yêu cầu trình duyệt bỏ qua tiêu đề http này và chỉ hiển thị khung không?

Trả lời

21

Nếu công ty thứ 2 vui mừng khi bạn truy cập nội dung của họ trong IFrame thì họ cần phải thực hiện hạn chế - họ có thể thực hiện điều này khá dễ dàng trong cấu hình IIS.

Không có gì bạn có thể làm để phá hỏng nó và mọi thứ hoạt động sẽ được vá nhanh chóng trong hotfix bảo mật. Bạn không thể yêu cầu trình duyệt chỉ hiển thị khung nếu tiêu đề nội dung nguồn không được cho phép trong khung. Điều đó sẽ làm cho nó dễ dàng hơn trong việc chiếm đoạt phiên.

Nếu nội dung chỉ GET bạn không đăng lại dữ liệu thì bạn có thể lấy phía máy chủ trang và proxy nội dung mà không có tiêu đề, nhưng sau đó bất kỳ bài đăng nào trở nên bị vô hiệu.

+0

hiển thị trong iframe không được phép, nhưng có cách nào vẫn nhận html dưới dạng chuỗi thô không? – Mike

+0

Bạn sẽ có thể xóa nó và làm bất cứ điều gì bạn muốn với đánh dấu. – Legends

+1

@Điều khoản đó là ý của tôi bằng cách _proxy content_ :-) – Keith

8

Tiêu đề tùy chọn X-Frame-Options là một tính năng bảo mật được thực thi ở cấp trình duyệt.

Nếu bạn có quyền kiểm soát đối với cơ sở người dùng (IT dept cho ứng dụng corp), bạn có thể thử một thứ giống như tập lệnh greasemonkey (nếu bạn có thể) triển khai greasemonkey trên tất cả mọi người và b) triển khai tập lệnh của bạn theo cách được chia sẻ). ..

Hoặc, bạn có thể ủy quyền kết quả của chúng. Tạo điểm cuối trên máy chủ của bạn và có điểm cuối đó mở một kết nối đến điểm cuối đích và chỉ đơn giản là chuyển lưu lượng ngược về phía trước.

4

Đối với câu hỏi thứ hai - bạn có thể sử dụng Fiddler bộ lọc để đặt câu trả lời X-Frame-Options tiêu đề theo cách thủ công thành một cái gì đó như ALLOW-FROM *. Nhưng, tất nhiên, mẹo này sẽ chỉ hoạt động cho bạn - những người dùng khác vẫn không thể xem nội dung iframe (nếu họ không làm như vậy).

12

Bạn có thể bỏ qua tùy chọn khung hình X trong bằng YQL. Dưới đây là bằng chứng về khái niệm, được thử nghiệm trong Chrome & Firefox: Hacker News in an <iframe>.

Quá trình này như sau:

  1. Yêu cầu một URL iframe từ YQL (chức năng loadURL),
  2. Nhận một dữ liệu HTML từ YQL (chức năng getData),
  3. Thêm một <base link><script> tải liên kết trong iframe bằng YQL,
  4. Tiêm HTML này vào một ô trống (hàm loadHTML).

Mẫu mã JS:

var iframe = document.getElementsByTagName('iframe')[0]; 
var url = iframe.src; 
var getData = function (data) { 
    if (data && data.query && data.query.results && data.query.results.resources && data.query.results.resources.content && data.query.results.resources.status == 200) loadHTML(data.query.results.resources.content); 
    else if (data && data.error && data.error.description) loadHTML(data.error.description); 
    else loadHTML('Error: Cannot load ' + url); 
}; 
var loadURL = function (src) { 
    url = src; 
    var script = document.createElement('script'); 
    script.src = 'http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20data.headers%20where%20url%3D%22' + encodeURIComponent(url) + '%22&format=json&diagnostics=true&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback=getData'; 
    document.body.appendChild(script); 
}; 
var loadHTML = function (html) { 
    iframe.src = 'about:blank'; 
    iframe.contentWindow.document.open(); 
    iframe.contentWindow.document.write(html.replace(/<head>/i, '<head><base href="' + url + '"><scr' + 'ipt>document.addEventListener("click", function(e) { if(e.target && e.target.nodeName == "A") { e.preventDefault(); parent.loadURL(e.target.href); } });</scr' + 'ipt>')); 
    iframe.contentWindow.document.close(); 
} 
loadURL(iframe.src); 
+5

Cách tiếp cận này có vẻ bị chặn ngay bây giờ. –

+0

@KarlGlennon Nó hoạt động ít nhất trong Firefox 44. – niutech

+0

"' Từ chối hiển thị 'https://news.ycombinator.com/' trong một khung vì nó đặt 'X-Frame-Options' thành 'DENY''. " Tiếp theo là "' fiddle.jshell.net/:64 Uncaught SecurityError: Vi phạm truy cập Sandbox: Chặn một khung tại "http://fiddle.jshell.net" truy cập vào một khung ở "null". Khung được truy cập là sandboxed và thiếu cờ "cho phép cùng một nguồn gốc". " – brichins

3

Có Fiddler là một lựa chọn cho tôi

Trong chức năng OnBeforeResponse của CustomRules.js (Fiddler menu> Nội quy> Nội quy Customize) thêm dòng sau dòng

oSession.oResponse.headers.Remove("X-Frame-Options"); 
oSession.oResponse.headers.Add("Access-Control-Allow-Origin", "*"); 
+0

Điều này hoạt động như một sự quyến rũ. Xuất sắc. – TrippinBilly

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