2012-05-25 23 views
10

tôi muốn triển khai Framebursting chọn lọc cho ứng dụng iframe của mình.Chọn lọc Framebursting

iframe của tôi là có sẵn tại www.mywebsite.con/iframe.aspx?lic=1234

Khi trang web của bên thứ ba lưu trữ iframe của tôi là (PayedWebsited1.con HOẶC PayedWebsited2.con) VÀ tùy chọn lic=1234 cũng tồn tại, hiển thị iframe. Đối với bất kỳ gian lận khác, chuối hiển thị!

Tôi có thể làm như thế nào?

+0

Bạn cần một số ngôn ngữ phía máy chủ để kiểm tra điều này và prodivde nội dung theo. Trừ khi bạn muốn lưu trữ 'lic =' trong JS của bạn, vì vậy mọi người có thể đọc chúng. – pduersteler

+0

Xin chào, bạn có thể cung cấp cho tôi một mẫu nhỏ không? – OrElse

Trả lời

-1

Global.asax đã thực hiện thủ thuật!

Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs) 
     Dim ref As String = HttpContext.Current.Request.ServerVariables("HTTP_REFERER") 
     If Not ref.Contains("PayedWebsited1") And Not ref.Contains("PayedWebsited2") Then 
      Response.Redirect("MYDOMAIN", True) 
     End If 
End Sub 

Nhờ tất cả!

+0

Vì điều này không bao gồm bất kỳ JavaScript nào, đây không phải là việc phá khung. Bây giờ bên trong khung, bạn nhận được yêu cầu với REFERER = some_site. Sau đó, bạn chuyển hướng, vì vậy bên trong khung bạn nhận được cùng một trang, ngay sau khi chuyển hướng. Bây giờ REFERER = your_site và trang được hiển thị. Và nó vẫn còn trong khung. –

0

Do tính bảo mật, trình duyệt của bạn sẽ không cho phép bạn sử dụng javascript để phát hiện URL của trang gốc (nghĩa là trang chứa iframe hiển thị trang của bạn).

Các giải pháp duy nhất tôi có thể nghĩ đến là:

  1. Nhấn mạnh rằng người dùng của trang iframe.aspx của bạn, bao gồm một param GET bổ sung mà khẳng định lĩnh vực mà họ đang sử dụng.
  2. Sử dụng Request.UrlReferrer để có được giới thiệu

Trên trang mà bạn render, bạn nên có một chữ đó, bạn nên muốn ngăn chặn người đó từ khung trang của bạn, bạn chỉ có thể thêm javascript cần thiết để buộc các khung hình.

Thật không may nếu Javascript bị vô hiệu hóa, điều này sẽ làm cho mã của bạn vô dụng ...

Hope this helps?

protected void page_load(object sender, EventArgs e) 
{ 
    bool killFrames = false; 
    if(Request.QueryString["lic"] == null) 
     killFrames = true; 
    if(!killFrames && Request.UrlReferrer != null) 
    { 
     // do some database check against the LIC and Referrer 
     // and set killFrames accordingly. 
    } 
    if(killFrames) 
    { 
     literalFrame.Text = "<script type=\"text/javascript\">if(top.location != location) { top.location.href = document.location.href; }</script>"; 
     // or show the bananas 
    } 
    else 
    { 
     // render the page accordingly. 
    } 
} 
0

tôi sẽ cố gắng chỉ ra một giải pháp cho vấn đề chung của bạn và không phải vấn đề kỹ thuật đặc biệt này, mà như xa như tôi biết là không thể đối với biện pháp phòng ngừa an ninh được thực hiện bởi tất cả các trình duyệt web.


Bạn cần một số loại lắc tay giữa ứng dụng của họ và của bạn và điều đó sẽ được thực hiện phía máy chủ.

Mỗi PayedWebsite phải có mật khẩu (hoặc nếu chúng sử dụng địa chỉ IP tĩnh bạn có thể sử dụng). Nội bộ trên máy chủ của họ (bằng cách sử dụng CURL có thể được) họ shold gửi cho bạn -via POST- mật khẩu của họ; sau đó bạn trả lại mã thông báo được sử dụng trong khung nội tuyến.

iframe.aspx?lic=1234&token=d16evg5tr44e0trty45xp6es5 

Và mã thông báo chỉ hoạt động một lần; do đó, quy trình sẽ được lặp lại mỗi khi khung nội tuyến cần được mở. Và bạn từ chối mọi kết nối không bao gồm mã thông báo hợp lệ.

4

Vấn đề là, số giấy phép đó sẽ không giúp ích gì cả - cho dù bạn sẽ sử dụng giải pháp phía máy chủ hay trong javascript. Các rạp sẽ có thể thấy số giấy phép đó trong PayedWebsite1.com.

Như đã nói, bạn không thể có được vị trí khung chính, nhưng bạn có thể nhận được liên kết giới thiệu - nó tương đương với khung chính, nếu trang của bạn được tải trong khung nội tuyến.

if (window.top.location !== document.location) { // only if we're in iframe 
          // we get host of our referrer 
    var host = document.referrer.match(new RegExp("(http|https)://(.*?)/.*$"))[2]; 
    host = host.toLowerCase(); // convert to lower case 
    var myHost = document.location.host.toLowerCase(); 
    if (
     host !== myHost     // so we can click on links in an iframe 
     && host !== 'payedwebsite1.com' 
     && host !== 'payedwebsite2.com' 
    ) { 
     window.top.location.href = document.location.href; 
    } 
} 

Được biết, kỹ thuật này có thể bị đánh bại.Xem thêm thông tin tại http://javascript.info/tutorial/clickjacking

Đối với các trình duyệt mới hơn, bạn có thể gửi tiêu đề đặc biệt:

Logic giữ giống nhau, chỉ trong server-side. Kiểm tra giới thiệu, nếu PayedDomain hoặc tên miền của riêng bạn, chỉ cần tiếp tục. Nếu không, hãy gửi tiêu đề này.

+0

Xin chào, tôi đã thử giải pháp của bạn nhưng iframe được tải ở chế độ toàn màn hình tại payedwebsite1.com Bạn có thể vui lòng cập nhật cho tôi không? – OrElse

+0

Tên miền phải chính xác như được kiểm tra, đó là "payedwebsite1.com", không phải ví dụ "www.payedwebsite1.com". Tôi không thể cung cấp thêm bất kỳ thông tin nào mà không thấy vấn đề của bạn - bạn có thể đưa ra một liên kết không? Tôi đã thử nghiệm nó tại địa phương và nó hoạt động tốt. Bạn có thể gỡ lỗi bằng cách thay đổi mã bên trong nếu thành một cái gì đó như console.log (máy chủ); hoặc cảnh báo (máy chủ); –

+0

Cũng lưu ý rằng nếu payedwebsite.com nằm trong HTTPS và iframe của bạn nằm trong HTTP, liên kết giới thiệu sẽ không được gửi. –

0

Tôi không phải là chuyên gia .NET, nhưng có vẻ như giải pháp của bạn có thể dễ dàng được giải quyết bằng cách theo dõi tiêu đề giới thiệu mà khách hàng gửi đến trang của bạn khi tải nội dung iframe.

Bạn có thể muốn tham khảo một câu hỏi khác liên quan đến tham khảo tiêu đề: how should we validate http header referrer in aspx .net

Về cơ bản, bạn sẽ làm như sau

  1. Sử dụng tiêu đề giới thiệu để có được những tên miền
  2. Tra cứu tên miền trong cơ sở dữ liệu của bạn (để xem nếu có giấy phép cho trang web đó)
  3. Gửi trang thực hoặc chuối tùy thuộc vào kết quả của trận đấu.
+0

Người giới thiệu không đáng tin cậy đối với bất kỳ điều gì yêu cầu bảo mật thực tế (chúng dễ bị giả mạo). Tôi nghĩ rằng OP muốn một cái gì đó người dùng không thể có được xung quanh. – Brilliand

+1

Tôi nghĩ rằng đó không phải là biện pháp bảo mật, nhưng chỉ giới hạn khung nội tuyến - liên kết giới thiệu là OK trong trường hợp này. Bạn vẫn có thể xem nội dung trang khi được mở không có trong khung nội tuyến, do đó giả mạo liên kết giới thiệu không có điểm. Trừ khi có một cách để giả mạo nó với trang khung nội tuyến (?) –

+0

Không chỉ các liên kết giới thiệu dễ bị giả mạo, chúng thường bị tước khỏi yêu cầu của phần mềm bảo mật có chủ ý. – jatrim

3

Nếu có thể cho người sử dụng của bên thứ ba của bạn để bao gồm một tập tin javascript, hoặc lý tưởng gửi một yêu cầu trong ASP trước khi vẽ trang, điều này là những gì tôi sẽ làm gì:

Javascript

  1. Tạo trang ASP (Tôi làm PHP, vì vậy ví dụ của tôi bằng PHP) trên máy chủ của bạn kiểm tra liên kết giới thiệu và số giấy phép để khớp với tài khoản trong cơ sở dữ liệu của bạn. Tệp ASP sau đó sẽ xuất các hàm javascript sẽ thay thế hoặc chèn vào phần tử iframe được chỉ định của bạn bằng khóa "một lần sử dụng" mà bạn tạo. Các tập tin có thể trông tương tự như sau:

    <?php 
    $lic = $_GET['lic']; // Do better validation (short for demo purposes) 
    if (valid_license($lic, $_SERVER['HTTP_REFERER'])) { 
        $one_time_key = get_access_key($lic); 
        ?> 
        function drawIframe() { 
         document.getElementById('iframe_target').innerHTML = "<iframe src='mysite.php?key=<?php echo $one_time_key;?>'></iframe>"; 
        } 
        <?php 
    } 
    else { 
        echo "You are not authorized to use this service."; 
    } 
    
  2. Có khách hàng của bạn bao gồm mã này javascript như một sự thay thế của iframe bạn, trong một thời trang tương tự như sau:

    <script src="http://www.yoursite.com/preauth.php?lic=1234"></script> 
    <script>drawIframe();</script> 
    <div id="iframe_target"></div> 
    
  3. Trên trang đó là được tải bởi khung nội tuyến, ngay lập tức kiểm tra khóa mà bạn đã tạo dựa trên giá trị được chuyển đến iframe. Nếu nó hợp lệ, ngay lập tức xóa hoặc thay đổi trạng thái của khóa để bạn biết nó đã được sử dụng. Sau đó hiển thị ứng dụng phù hợp.

    • phương pháp javascript Đây sẽ là phương pháp đau đớn nhất cho người sử dụng của bên thứ ba của bạn, mặc dù nó có thể bị đánh bại (người dùng có thể thay đổi "giới thiệu" được gửi tới máy chủ của bạn, mặc dù nó là khó xảy ra.)

ASP

Nếu bạn có thể có được người dùng của bạn để thực hiện một yêu cầu đến địa chỉ của bạn trong vòng máy chủ của họ, bạn sẽ loại bỏ để lộ bất kỳ thông tin rủi ro như giấy phép cho người dùng. Họ có thể gọi một cái gì đó như $key = file_get_contents("http://www.yoursite.com/preauth.asp?lic=1234"); Ngay sau khi họ có thể xuất ra iframe bằng khóa sử dụng một lần mà bạn vừa tạo.

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