Έλεγχος ενσωμάτωσης iframe
Δωρεάν διαδικτυακός έλεγχος IFrame: εισάγετε τη διεύθυνση URL οποιουδήποτε ιστότοπου για να εξετάσετε τους headers X-Frame-Options και Content-Security-Policy frame-ancestors, μάθετε αν η σελίδα μπορεί να ενσωματωθεί σε IFrame και επιβεβαιώστε το με ζωντανή προεπισκόπηση. Ιστορικό διατηρείται μόνο για την τρέχουσα συνεδρία του περιηγητή.
Ιστορικό (αυτή η συνεδρία)
Αποθηκεύεται μόνο σε αυτή την καρτέλα (sessionStorage· εκκαθαρίζεται όταν κλείσετε την καρτέλα. Κανένα δεδομένο δεν αποστέλλεται στον server.
Πώς λειτουργεί ο έλεγχος
- Εισάγετε τη διεύθυνση URL προορισμού και κάντε κλικ στο Έλεγχος. Ο serverfetches τη σελίδα ως πραγματικό αίτημα iframe (με Sec-Fetch-Dest: iframe) και διαβάζει τους headers της απόκρισής.
- Το αποτέλεσμα προκύπτει από τα X-Frame-Options (DENY / SAMEORIGIN αποκλείουν την ενσωμάτωση) και το Content-Security-Policy frame-ancestors (μόνο το * ή ένα wildcard για το schema επιτρέπει τυχαίους γονείς τρίτων).
- Η ίδια διεύθυνση URL φορτώνεται στο iframe της ζωντανής προεπισκόπησης ώστε να επιβεβαιώσετε τι κάνει πραγματικά ο περιηγητής, συμπεριλαμβανομένου του frame-busting JavaScript που τα headers δεν μπορούν να αποκαλύψουν.
Τι καθορίζει αν μια σελίδα μπορεί να ενσωματωθεί;
Το αν μια ιστοσελίδα μπορεί να εμφανιστεί εντός <iframe> σε άλλο ιστότοπο καθορίζεται από το πρόγραμμα περιήγησης, βάσει των response headers που στέλνει η ίδια η σελίδα. Αυτό το εργαλείο ελέγχου εκτελεί τον ίδιο έλεγχο στον server και παρέχει άμεσο συμπέρασμα.
Το X-Frame-Options είναι το κλασικό header: Το DENY απαγορεύει την ενσωμάτωση παντού, το SAMEORIGIN επιτρέπει μόνο σε σελίδες από την ίδια προέλευση να την ενσωματώσουν, και το ALLOW-FROM έχει καταργηθεί στα σύγχρονα browsers. Όταν το header απουσιάζει, οι παλαιότεροι κανόνες δεν εμποδίζουν την ενσωμάτωση.
Το Content-Security-Policy frame-ancestors είναι η σύγχρονη αντικατάσταση. Καταγράφει τις προελεύσεις που επιτρέπεται να ενσωματώσουν τη σελίδα — π.χ. frame-ancestors 'self' https://example.com. Η τιμή * (ή ένα απλό πρωτόκολλο όπως https:) επιτρέπει οποιοδήποτε parent HTTPS· κάτι πιο περιορισμένο αποκλείει την ενσωμάτωση από τρίτους.
Τα headers δεν καλύπτουν όλες τις περιπτώσεις: τα scripts της σελίδας μπορούν να εκτελέσουν κώδικα διάσπασης πλαισίων (frame-busting, συγκρίνοντας top !== self και αναγκάζοντας navigation κορυφαίου επιπέδου), ενώ οι σελίδες login ή οι endpoints με γεωγραφικούς περιορισμούς μπορεί να αντιδρούν διαφορετικά σε αιτήματα από data centers. Γι’ αυτό κάθε αποτέλεσμα συνοδεύεται από ζωντανή προεπισκόπηση (live preview).
Γρήγορος οδηγός: ρύθμιση headers απόκρισης
Αν διαχειρίζεστε τον ιστότοπο, ελέγξτε την ενσωμάτωση σε iframe απευθείας μέσω των response headers.
Αποκλεισμός ενσωμάτωσης από οποιαδήποτε σελίδα
X-Frame-Options: DENY
Content-Security-Policy: frame-ancestors 'none'
Τα προγράμματα περιήγησης αρνούνται να αποδώσουν τη σελίδα σε οποιοδήποτε iframe — αποτελεί την πιο αυστηρή προστασία από clickjacking.
Επιτρέπεται ενσωμάτωση μόνο από την ίδια προέλευση (same-origin)
X-Frame-Options: SAMEORIGIN
Content-Security-Policy: frame-ancestors 'self'
Μόνο σελίδες με ίδιο πρωτόκολλο, domain και θύρα μπορούν να την ενσωματώσουν· οι ιστοσελίδες τρίτων αποκλείονται.
Επιτρέπεται ενσωμάτωση μόνο από συγκεκριμένες προελεύσεις
Content-Security-Policy: frame-ancestors 'self' https://trusted.example.com
Καταχωρίστε τις αξιόπιστες προελεύσεις στο frame-ancestors· οι μη καταχωρισμένες θα αποκλειστούν.
Επιτρέπεται ενσωμάτωση από οποιαδήποτε σελίδα
Μην ορίσετε το X-Frame-Options
Content-Security-Policy: frame-ancestors *
Οποιαδήποτε ιστοσελίδα μπορεί να εμφανίσει τη σελίδα σε iframe. Αξιολογήστε τον συμβιβασμό ασφαλείας.
Σημείωση: Το X-Frame-Options υποκαθίσταται από το CSP frame-ancestors. Όταν συνυπάρχουν, προτεραιότητα έχει το CSP — προτιμήστε το frame-ancestors.
Πώς αντιλαμβάνεται ο server ότι το αίτημα προέρχεται από iframe;
Σταδιακά από το 2020, τα browsers που βασίζονται σε Chromium και Firefox προσθέτουν αυτόματα ένα σύνολο request headers Fetch Metadata σε κάθε πλοήγηση (navigation) και αίτημα δευτερεύοντος πόρου (subresource). Το πιο χρήσιμο για τον έλεγχο ενσωμάτωσης είναι το Sec-Fetch-Dest — ενημερώνει τον server για το είδος του περιβάλλοντος context που ζητά τον πόρο, χωρίς καμία συνεργασία από την αιτούσα σελίδα.
- Sec-Fetch-Dest: document — άμεση πλοήγηση κορυφαίου επιπέδου, όχι μέσα σε κάποιο frame.
- Sec-Fetch-Dest: iframe — το request φορτώνεται εντός στοιχείου <iframe>.
- Sec-Fetch-Dest: frame — φορτώνεται εντός παλιού <frame> (frameset).
- Sec-Fetch-Dest: embed / object — φορτώνεται εντός στοιχείου <embed> ή <object>.
Αυτό το εργαλείο ελέγχου στέλνει το δικό του δοκιμαστικό αίτημα με την κεφαλίδα Sec-Fetch-Dest: iframe, αντιγράφοντας ακριβώς τη συμπεριφορά ενός πραγματικού προγράμματος περιήγησης κατά την ενσωμάτωση μιας σελίδας — έτσι ώστε το τελικό αποτέλεσμα να αντανακλά τον πραγματικό τρόπο λειτουργίας του διακομιστή προορισμού για γνήσια αιτήματα iframe και όχι απλώς για τυπικά requests.
Η κεφαλίδα Sec-Fetch-Dest αποτελεί χρήσιμο σήμα, ωστόσο δεν δημιουργεί όριο ασφαλείας. Διαβιβάζεται αποκλειστικά από σύγχρονα προγράμματα περιήγησης, ενώ μη browser πελάτες — όπως το curl, bots, ορισμένα webviews και παλαιότερες εκδόσεις browsers — μπορούν να το παραλείψουν εντελώς ή να στείλουν οποιαδήποτε αυθαίρετη τιμή. Ο διακομιστής θα έπρεπε να κάνει logging ή να εφαρμόζει rate limiting με βάση αυτό, αλλά δεν πρέπει ποτέ να βασιζεται αποκλειστικά πάνω του για να αξιολογήσει αν η πλαισίωση είναι ασφαλής. Η απόφαση αυτή ανατίθεται στις κεφαλίδες X-Frame-Options και CSP frame-ancestors, οι οποίες επιβάλλονται από τους browsers ανεξάρτητα από τα headers του αιτήματος.
Από πλευράς client, μια σελίδα μπορεί επίσης να εντοπίσει ότι εκτελείται μέσα σε ένα frame χωρίς καμία αντίστοιχη κεφαλίδα, π.χ. μέσω σύγκρισης window.top !== window.self (ή ανάγνωσης του window.frameElement για frames ίδιας προέλευσης), και στη συνέχεια να αντιδράσει — εμφανίζοντας προειδοποίηση ή επιβάλλοντας redirect σε επίπεδο root. Πρόκειται για τη γνωστή ως «τεχνική διάσπασης πλαισίου» (frame-busting), η οποία λειτουργεί ανεξάρτητα από το περιεχόμενο των κεφαλίδων του αιτήματος.
Παραδείγματα διαμόρφωσης server: μπλοκάρισμα ενσωμάτωσης iframe
Τα παρακάτω αποσπάσματα δείχνουν πώς να διαμορφώσετε κάθε server ή framework ώστε να αποκλείσετε πλήρως την ενσωμάτωση σε iframe (X-Frame-Options: DENY + CSP frame-ancestors 'none') — η πιο αυστηρή ρύθμιση του παραπάνω γρήγορου οδηγού.
server {
location / {
add_header X-Frame-Options "DENY" always;
add_header Content-Security-Policy "frame-ancestors 'none'" always;
}
}
<IfModule mod_headers.c>
Header always set X-Frame-Options "DENY"
Header always set Content-Security-Policy "frame-ancestors 'none'"
</IfModule>
app.use((req, res, next) => {
res.setHeader('X-Frame-Options', 'DENY');
res.setHeader('Content-Security-Policy', "frame-ancestors 'none'");
next();
});
// next.config.js
module.exports = {
async headers() {
return [
{
source: '/:path*',
headers: [
{ key: 'X-Frame-Options', value: 'DENY' },
{ key: 'Content-Security-Policy', value: "frame-ancestors 'none'" },
],
},
];
},
};
class SetFrameOptions
{
public function handle(Request $request, Closure $next): Response
{
$response = $next($request);
$response->headers->set('X-Frame-Options', 'DENY');
$response->headers->set('Content-Security-Policy', "frame-ancestors 'none'");
return $response;
}
}
export default {
async fetch(request) {
const response = await fetch(request);
const headers = new Headers(response.headers);
headers.set('X-Frame-Options', 'DENY');
headers.set('Content-Security-Policy', "frame-ancestors 'none'");
return new Response(response.body, { status: response.status, headers });
},
};
Χρειάζεται να επιτρέψετε μόνο τη δική σας ιστοσελίδα ή μια σύντομη λίστα επιτρεπόμενων (allow-list) αντί να μπλοκάρετε όλους τους επισκέπτες; Αντικαταστήστε το DENY με SAMEORIGIN, και το 'none' με 'self' ή μια ρητή λίστα προελεύσεων — η υπόλοιπη διαμόρφωση παραμένει αμετάβλητη.
Σημεία προσοχής σε γνωστές πλατφόρμες
Πέραν των γενικών κανόνων για τις κεφαλίδες HTTP, κάποιες καθιερωμένες πλατφόρμες παρουσιάζουν δικές τους ιδιαιτερότητες. Αξίζει να τις γνωρίζετε πριν υποθέσετε ότι κάτι είναι «αποκλεισμένο» ή «ενσωματώσιμο» βάσει μόνο των κεφαλίδων.
| Πλατφόρμα / σενάριο | Συμπεριφορά | Γιατί |
|---|---|---|
| Σελίδα παρακολούθησης YouTube (youtube.com/watch) | Αποκλεισμένο | Χρησιμοποιήστε τη διεύθυνση του επίσημου player: youtube.com/embed/{id} — η κανονική σελίδα παρακολούθησης επιστρέφει περιοριστική πολιτική πλαισίωσης. |
| Σελίδα τοποθεσίας Google Maps | Αποκλεισμένο | Μόνο η διεύθυνση iframe της Maps Embed API (google.com/maps/embed) προορίζεται για ενσωμάτωση σε πλαίσιο. |
| Σελίδες σύνδεσης OAuth Google / Microsoft | Αποκλεισμένο | Αποκλείστηκε σκόπιμα από το 2015 για την προστασία από phishing κωδικών πρόσβασης μέσα σε iframes· η διαδικασία σύνδεσης πρέπει να εκτελείται σε παράθυρο πρώτου επιπέδου ή popup. |
| Σελίδες πληρωμής / πληρωμών (Stripe Checkout, PayPal, οι περισσότερες τραπεζικές πύλες) | Αποκλεισμένο | Η πλαισίωση φόρμας πληρωμής αποτελεί κλασικό μέσο clickjacking, επομένως οι πάροχοι πληρωμών το απορρίπτουν εκτόνως. |
| Σελίδες αποθετηρίου / αρχείου GitHub | Αποκλεισμένο | frame-ancestors 'none' σε επίπεδο site· χρησιμοποιήστε το API REST/GraphQL ή ένα στιγμιότυπο οθόνης αντί για iframe. |
| Σελίδες «Δημοσίευση στο Web» Notion / Google Docs | Ενσωματώσιμο | Σχεδιάστηκαν ρητά για ενσωμάτωση και το προϊόν παρέχει έτοιμο κώδικα embed. |
| Άρθρα Wikipedia | Ενσωματώσιμο | Δεν υπάρχει περιοριστική κεφαλίδα X-Frame-Options/CSP προκαθορισμένα, αλλά ελέγξτε τους όρους αδειοδότησης και αναφοράς πηγής πριν την ενσωμάτωση σε μεγάλη κλίμακα. |
Συχνές χρήσεις
- Αποφασίστε αν ένα widget, πίνακα ελέγχου ή έγγραφο τρίτων μπορεί να ενσωματωθεί στο δικό σας προϊόν, πριν ξεκινήσετε τον κώδικα ενσωμάτωσης.
- Επαληθεύστε ότι ο δικός σας ιστότοπος αποστέλλει την πολιτική X-Frame-Options ή CSP frame-ancestors που είχατε ορίσει.
- Εντοπισμός σφαλμάτων στην προστασία από clickjacking: κατανοήστε γιατί μια σελίδα εμφανίζει about:blank ή μήνυμα άρνησης μέσα σε iframe.
- Ομαδικός έλεγχος υποψήφιων URL κατά τη συλλογή περιεχομένου ή την ενσωμάτωση πύλης, αξιοποιώντας το ιστορικό της συνεδρίας για επαναξιολόγηση των αποτελεσμάτων.
- Προετοιμαστείτε για κριτικές ασφαλείας ή δοκιμές διείσδυσης, τεκμηριώνοντας την πολιτική πλαισίωσης (framing) των εξωτερικών εξαρτήσεων.