วิธีการตั้งค่า 'X-Frame-Options' ใน iframe


170

ถ้าฉันสร้างสิ่งiframeนี้:

var dialog = $('<div id="' + dialogId + '" align="center"><iframe id="' + frameId + '" src="' + url + '" width="100%" frameborder="0" height="'+frameHeightForIe8+'" data-ssotoken="' + token + '"></iframe></div>').dialog({

ฉันจะแก้ไขข้อผิดพลาดได้อย่างไร:

ปฏิเสธที่จะแสดง'https://www.google.com.ua/?gws_rd=ssl'ในเฟรมเนื่องจากตั้งค่า 'X-Frame-Options' เป็น 'SAMEORIGIN'

ด้วย JavaScript?

คำตอบ:


227

คุณไม่สามารถตั้งบนX-Frame-Options iframeนั่นคือส่วนหัวการตอบสนองที่กำหนดโดยโดเมนที่คุณร้องขอทรัพยากร ( google.com.uaในตัวอย่างของคุณ) พวกเขาได้ตั้งค่าส่วนหัวเป็นSAMEORIGINในกรณีนี้ซึ่งหมายความว่าพวกเขาไม่อนุญาตให้โหลดทรัพยากรในiframeนอกโดเมน สำหรับข้อมูลเพิ่มเติมดูหัวข้อการตอบสนอง X-Frame-Optionsบน MDN

การตรวจสอบอย่างรวดเร็วของส่วนหัว (แสดงที่นี่ในเครื่องมือสำหรับนักพัฒนาซอฟต์แวร์ Chrome) จะแสดงX-Frame-Optionsค่าที่ส่งคืนจากโฮสต์

ป้อนคำอธิบายรูปภาพที่นี่


7
ด้วย YouTube คุณสามารถเปลี่ยน URL ปลายทางเป็นเวอร์ชัน "ฝัง" ดูstackoverflow.com/questions/25661182/… (ฉันรู้ว่านี่ไม่ใช่สิ่งที่ OP ค้นหา แต่ google ให้ผลลัพธ์นี้เป็นอันดับแรก!)

73

X-Frame-Optionsเป็นส่วนหัวที่รวมอยู่ในการตอบสนองต่อคำขอให้ระบุหากโดเมนที่ร้องขอจะอนุญาตให้แสดงตัวเองภายในเฟรม มันไม่มีส่วนเกี่ยวข้องกับ javascript หรือ HTML และผู้สร้างไม่สามารถเปลี่ยนแปลงได้

iframeเว็บไซต์นี้ได้มีการกำหนดส่วนหัวนี้จะไม่อนุญาตให้มีการแสดงใน ไม่มีสิ่งใดที่ไคลเอ็นต์สามารถทำได้เพื่อหยุดพฤติกรรมนี้

อ่านเพิ่มเติมเกี่ยวกับ X-Frame-Options


มันตั้งอยู่ในส่วนหัวของการตอบสนองไม่ขอส่วนหัว แต่คำอธิบายที่ถูกต้องเป็นอย่างอื่น!
nickang

2
@ นิคกังนั่นคือสิ่งที่ฉันหมายถึง แต่ฉันเห็นด้วยกับคำศัพท์ที่ไม่ชัดเจน ฉันแก้ไขมันเพื่อลบความสับสนใด ๆ ขอบคุณ
Rory McCrossan

31

ในกรณีที่คุณอยู่ในการควบคุมของเซิร์ฟเวอร์ที่ส่งเนื้อหาของ iframe คุณสามารถตั้งค่าสำหรับX-Frame-Optionsเว็บเซิร์ฟเวอร์ของคุณ

การกำหนดค่า Apache

หากต้องการส่งส่วนหัว X-Frame-Options สำหรับทุกหน้าให้เพิ่มส่วนนี้ลงในการกำหนดค่าไซต์ของคุณ:

Header always append X-Frame-Options SAMEORIGIN

การกำหนดค่า nginx

ในการกำหนดค่า nginx เพื่อส่งส่วนหัว X-Frame-Options ให้เพิ่มส่วนนี้ไปยังการกำหนดค่า http เซิร์ฟเวอร์หรือตำแหน่งของคุณ:

add_header X-Frame-Options SAMEORIGIN;

ไม่มีการกำหนดค่า

ตัวเลือกส่วนหัวนี้เป็นตัวเลือกดังนั้นหากไม่ได้ตั้งค่าตัวเลือกทั้งหมดคุณจะให้ตัวเลือกในการกำหนดค่านี้เป็นอินสแตนซ์ถัดไป (เช่นเบราว์เซอร์ผู้เข้าชมหรือพรอกซี)

แหล่งที่มา: https://developer.mozilla.org/en-US/docs/Web/HTTP/X-Frame-Options


สิ่งนี้ช่วยฉัน ฉันคอมเม้นท์สองบรรทัดนี้: add_header Strict-Transport-Security "max-age=86400; includeSubdomains"; add_header X-Frame-Options DENY;จาก nginx-snippets แล้วมันก็ใช้ได้ทันที
Zeth

NGINX สำคัญที่ต้องบอกว่าอยู่ที่ไหนในตำแหน่ง
Peter Krauss

Peter Kraus คุณต้องการอะไร
rubo77

14

เนื่องจากโซลูชันไม่ได้กล่าวถึงด้านเซิร์ฟเวอร์จริง ๆ :

หนึ่งต้องตั้งค่าสิ่งนี้ (ตัวอย่างจาก apache) นี่ไม่ใช่ตัวเลือกที่ดีที่สุดที่อนุญาตในทุกอย่าง แต่หลังจากที่คุณเห็นเซิร์ฟเวอร์ของคุณทำงานอย่างถูกต้องคุณสามารถเปลี่ยนการตั้งค่าได้อย่างง่ายดาย

           Header set Access-Control-Allow-Origin "*"
           Header set X-Frame-Options "allow-from *"

5

ไม่จริง ... ฉันใช้

 <system.webServer>
     <httpProtocol allowKeepAlive="true" >
       <customHeaders>
         <add name="X-Frame-Options" value="*" />
       </customHeaders>
     </httpProtocol>
 </system.webServer>

ดูเหมือนโซลูชัน แต่นี่เป็นการละเมิดความปลอดภัยหรือไม่
Yogurtu

1
คุณไม่ควรปิดการใช้งานนโยบายต้นทางเดียวกันสำหรับเว็บไซต์ของคุณเว้นแต่คุณจะรู้ว่าคุณกำลังทำอะไรอยู่ คุณไม่ควรอนุญาตให้โดเมนต่างจากของคุณเพื่อฝังเนื้อหา ดูcodecademy.com/articles/what-is-corsและบทแนะนำที่คล้ายกัน
slhck


2

X-Frame-ตัวเลือกส่วนหัวของการตอบสนอง HTTP สามารถนำมาใช้เพื่อระบุหรือไม่ว่าเบราว์เซอร์ควรได้รับอนุญาตในการแสดงผลหน้าใน<frame>, หรือ<iframe> <object>ไซต์สามารถใช้สิ่งนี้เพื่อหลีกเลี่ยงการโจมตีด้วยการคลิกโดยตรวจสอบให้แน่ใจว่าเนื้อหาของพวกเขาไม่ได้ถูกฝังลงในเว็บไซต์อื่น

สำหรับข้อมูลเพิ่มเติม: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options

ฉันมีทางเลือกอื่นสำหรับปัญหานี้ซึ่งฉันจะสาธิตโดยใช้ PHP:

iframe.php:

<iframe src="target_url.php" width="925" height="2400" frameborder="0" ></iframe>

target_url.php:

<?php 
  echo file_get_contents("http://www.example.com");
?>

5
นี่เป็นโซลูชันที่ใช้งานได้เพื่อใช้หน้าหลังจากโหลดหรือไม่ ฉันจะสามารถโต้ตอบกับหน้าหลังจากโหลด inital ได้หรือไม่ จะไม่ขอพร็อกซีทุกโดเมนสำหรับการใช้เนื้อหาหลังจากโหลดหรือไม่
Timothy Gonzalez

0

เพื่อจุดประสงค์นี้คุณต้องจับคู่ตำแหน่งใน Apache หรือบริการอื่น ๆ ที่คุณใช้งานอยู่

หากคุณใช้ apache อยู่ในไฟล์ httpd.conf

  <LocationMatch "/your_relative_path">
      ProxyPass absolute_path_of_your_application/your_relative_path
      ProxyPassReverse absolute_path_of_your_application/your_relative_path
   </LocationMatch>

0

ทางออกคือการติดตั้งปลั๊กอินเบราว์เซอร์

เว็บไซต์ที่ออก HTTP Header X-Frame-Optionsด้วยค่าDENY(หรือที่SAMEORIGINมีต้นกำเนิดเซิร์ฟเวอร์ที่แตกต่างกัน) ไม่สามารถรวมเข้ากับ IFRAME ... เว้นแต่คุณจะเปลี่ยนพฤติกรรมนี้โดยการติดตั้งปลั๊กอินของเบราว์เซอร์ที่ละเว้นX-Frame-Optionsส่วนหัว (เช่นIgnore X-Frame Head ของ Chrome )

โปรดทราบว่าสิ่งนี้ไม่แนะนำเลยด้วยเหตุผลด้านความปลอดภัย


0

คุณสามารถตั้งค่าตัวเลือก x-frame ใน web config ของเว็บไซต์ที่คุณต้องการโหลดใน iframe เช่นนี้

<httpProtocol>
    <customHeaders>
      <add name="X-Frame-Options" value="*" />
    </customHeaders>
  </httpProtocol>

ถ้าฉันต้องการเปิด stackoverflow ฉันจะหาเว็บปรับแต่งได้ที่ไหน? ไม่ใช่สำหรับฝั่งเซิร์ฟเวอร์ใช่ไหม
irum zahra

-1

คุณไม่สามารถเพิ่ม x-iframe ลงในเนื้อหา HTML ของคุณได้เนื่องจากเจ้าของไซต์จะต้องระบุและอยู่ในกฎของเซิร์ฟเวอร์

สิ่งที่คุณสามารถทำได้คือสร้างไฟล์ PHP ที่โหลดเนื้อหาของ URL เป้าหมายและ iframe ที่ php URL ซึ่งควรทำงานได้อย่างราบรื่น


1
"คุณสามารถทำได้" จากนั้นโพสต์เป็นความคิดเห็นหากไม่ใช่คำตอบ
MK

เกิดอะไรขึ้นถ้ามันจะออกมาเป็นคำตอบที่ MK
Sushant Chaudhari

จากนั้นเป็นคำแนะนำที่ใช้งานได้ไม่ใช่วิธีแก้ปัญหาเฉพาะดังนั้นควรวางไว้เป็นความคิดเห็น
MK

-2

คุณสามารถทำได้ในไฟล์กำหนดค่าระดับโพสต์ Tomcat (web.xml) จำเป็นต้องเพิ่ม 'ตัวกรอง' และตัวกรองการแมป 'ในไฟล์กำหนดค่า web.xml สิ่งนี้จะเพิ่ม [X-frame-options = DENY] ในหน้าทั้งหมดเนื่องจากเป็นการตั้งค่าส่วนกลาง

<filter>
        <filter-name>httpHeaderSecurity</filter-name>
        <filter-class>org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class>
        <async-supported>true</async-supported>
        <init-param>
          <param-name>antiClickJackingEnabled</param-name>
          <param-value>true</param-value>
        </init-param>
        <init-param>
          <param-name>antiClickJackingOption</param-name>
          <param-value>DENY</param-value>
        </init-param>
    </filter>

  <filter-mapping> 
    <filter-name>httpHeaderSecurity</filter-name> 
    <url-pattern>/*</url-pattern>
</filter-mapping>

-3

หากคุณกำลังติดตามแนวทาง xml รหัสด้านล่างจะใช้ได้

    <security:headers>
        <security:frame-options />
        <security:cache-control />
        <security:content-type-options />
        <security:xss-protection />
    </security:headers>
<security:http>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.