Iframe থেকে প্যারেন্ট URL এ অ্যাক্সেস করুন


187

ঠিক আছে, আমার একটি পৃষ্ঠা আছে এবং এই পৃষ্ঠায় আমার একটি আইফ্রেম আছে। আমার যা করা দরকার তা হ'ল iframe পৃষ্ঠায়, প্রধান পৃষ্ঠার URL কী তা খুঁজে বের করুন।

আমি চারপাশে অনুসন্ধান করেছি এবং আমি জানি যে যদি আমার আইফ্রেমে পৃষ্ঠাটি অন্য কোনও ডোমেনে থাকে তবে এটি ক্রস সাইট স্ক্রিপ্টিং হিসাবে সম্ভব নয়। তবে আমি যেখানেই পড়েছি সেখানে বলা হয়েছে যে যদি iframe পৃষ্ঠাটি মূল পৃষ্ঠায় একই ডোমেনে থাকে তবে উদাহরণস্বরূপ যদি এটি করা হয় তবে তা কাজ করা উচিত:

parent.document.location
parent.window.document.location
parent.window.location
parent.document.location.href

... বা অন্যান্য অনুরূপ কম্বোস যেমন একই তথ্য পাওয়ার একাধিক উপায় বলে মনে হচ্ছে।

যাইহোক, তাই এখানে সমস্যা। আমার আইফ্রেমে মূল পৃষ্ঠা হিসাবে একই ডোমেনে রয়েছে তবে এটি একই এসইউবি ডোমেনে নেই। উদাহরণস্বরূপ আমার আছে

http: // www.mysite.com/pageA.html

এবং তারপরে আমার আইফ্রেমে ইউআরএল

http: // qa-www.mysite.com/pageB.html

আমি যখন pageB.html(iframe পৃষ্ঠা) থেকে ইউআরএল দখল করার চেষ্টা করি তখন আমি একই অ্যাক্সেস ত্রুটি ত্রুটিযুক্ত পেতে থাকি। সুতরাং এটি উপস্থিত হয় যে এমনকি উপ-ডোমেনগুলি ক্রস-সাইট স্ক্রিপ্টিং হিসাবে গণনা করে, এটি কি সঠিক, বা আমি কিছু ভুল করছি?


আপনি কি কেবল এটিকে ফ্রেম URL এ পাস করতে পারবেন? যেমন<iframe src="url?parent=parent-url"></iframe>
বিয়াজিও আরববা

উত্তর:


21

আপনি ঠিক বলেছেন। সাবডোমেনগুলি এখনও আইফ্রেম ব্যবহার করার সময় পৃথক ডোমেন হিসাবে বিবেচিত হয়। এটি ব্যবহার করে বার্তাগুলি পাঠানো সম্ভব postMessage(...), তবে অন্যান্য জেএস এপিআইগুলি ইচ্ছাকৃতভাবে অ্যাক্সেসযোগ্য are

প্রসঙ্গের উপর নির্ভর করে ইউআরএল পাওয়া এখনও সম্ভব। আরও তথ্যের জন্য অন্যান্য উত্তর দেখুন।


1
ঠিক আছে ঠিক আছে। তবে কমপক্ষে আমি জানি আমি পাগল হয়ে যাচ্ছি না :( আহ ভাল, পরিকল্পনা করুন বি। ধন্যবাদ (এবং আমার জিনিস ট্যাগগুলিতে রাখার জন্য নয়, সম্পাদনার জন্য ধন্যবাদ)
ক্রোনোফওয়ার

9
এটি কীভাবে নির্বাচিত উত্তর হবে? নীচে সম্ভাব্য সমাধানগুলির আরও অনেক ভাল বর্ণনা রয়েছে।
অ্যানয়েজ

1
একমত! 80 টি ভোট দিয়ে নীচের উত্তরটি আরও ভাল। এই উত্তরটি এইচটিএমএল স্পেকে রয়েছে।
লিগামার

4
আপনি ২ এর মধ্যে ইন্টারঅ্যাক্ট করতে পারবেন তবে তবে আপনাকে অবশ্যই পিতামাতা ও আইফ্রেমে উভয়কেই নিম্নলিখিত স্ক্রিপ্টটি যুক্ত করতে হবে: <script> document.domain = "mydomain.com"; </script>
জর্জ

2
"আরও তথ্যের জন্য অন্যান্য উত্তর দেখুন।" hahah এটি মত: আমার কোন সমাধান নেই, অন্যান্য উত্তর দেখুন, তবে আমার উত্তরটিও গ্রহণ করুন।
মিলাদ

370

হ্যাঁ, যদি আইফ্রেম এবং মূল পৃষ্ঠাটি একই (উপ) ডোমেনে না থাকে তবে পিতামাতার পৃষ্ঠার URL টি অ্যাক্সেসের অনুমতি নেই allowed তবে, আপনার যদি কেবল প্রধান পৃষ্ঠার ইউআরএল প্রয়োজন (যেমন ব্রাউজারের ইউআরএল), আপনি এটি চেষ্টা করতে পারেন:

var url = (window.location != window.parent.location)
            ? document.referrer
            : document.location.href;

বিঃদ্রঃ:

window.parent.locationঅনুমতি দেওয়া হয়; এটি ওপিতে সুরক্ষা ত্রুটি এড়ায়, যা hrefসম্পত্তি অ্যাক্সেস করার কারণে ঘটে : window.parent.location.hrefকারণ "উত্স সহ একটি ফ্রেম অবরুদ্ধ ..."

document.referrer"এই পৃষ্ঠার সাথে লিঙ্ক করা পৃষ্ঠার ইউআরআই" উল্লেখ করে। এই হতে পারে না আসতে ধারণকারী ডকুমেন্ট যদি অন্য কিছু উৎস কী নির্ধারিত হয় iframe, অবস্থান উদাহরণস্বরূপ:

  • কনটেইনার iframe @ ডোমেন 1
  • শিশুকে iframe ডোমেন 2 এ প্রেরণ করে
  • তবে বাচ্চা আইফ্রেমে ... ডোমেন 2 ডোমেন 3 এ পুনঃনির্দেশ করে (অর্থাত্ প্রমাণীকরণের জন্য, সম্ভবত এসএএমএল), এবং তারপরে ডোমেন 3 ডোমেন 2-তে ফিরে আসে (অর্থাত ফর্ম জমা দেওয়ার মাধ্যমে)), একটি স্ট্যান্ডার্ড এসএএমএল কৌশল)
  • শিশুর জন্য iframe হ'ল document.referrerডোমেন 3 হবে , ডোমেন 1 ধারণকারী নয়

document.location"একটি অবস্থান অবজেক্টকে বোঝায়, এতে নথির URL সম্পর্কে তথ্য রয়েছে"; সম্ভবত বর্তমান ডকুমেন্ট, যা, iframe বর্তমানে খোলা আছে। যখন window.location === window.parent.location, তারপর আইফ্রেম এর hrefহয় একই ধারণকারী পিতা বা মাতা হিসাবে href


1
@ জেপসার এটি কারণ আপনার আইফ্রেমে সেই আইফ্রেমের অভ্যন্তর রয়েছে। মাঝখানে যে কোনওটি দিয়ে আপনার কখনই শীর্ষ ফ্রেমে অ্যাক্সেস পাবেন না। নেস্টেড ক্রস ডোমেন যদি এত স্তরে ভুল হয় তবে। তবে আপনি যদি document.domainশীর্ষ ফ্রেমে এবং ভিতরের সর্বাধিক একটিকে সেট করেন তবে আপনি এটি পেতে সক্ষম হতে পারেন । হতে পারে.
gcb

2
বা, আরও কিছুটা সংক্ষিপ্তভাবে:var url = (parent !== window) ? document.referrer : document.location;
thekingoftruth

2
দয়া করে মনে রাখবেন যে কন্টেইনারটি আপনার লোকালহোস্টে অবস্থিত থাকলে (বা আরও সাধারণভাবে, যদি এই পৃষ্ঠাটি ওয়েব সার্ভার দ্বারা খোলা না থাকে) বা ফাইল দ্বারা কল করা হয়: //।
গিলিয়াম রেনল্ট

5
এটি লক্ষ্য করা উচিত যে এটি Referer-Policyশিরোলেখ দিয়ে পরাস্ত হতে পারে ।
ড্যান অ্যাটকিনসন

2
এই এজ ব্রাউজার দিয়ে কাজ বলে মনে হচ্ছে না - রেফারার একটি খালি স্ট্রিং .. হতে হবে stackoverflow.com/questions/24169219/...
Davide Orazio Montersino

51

আমি খুব সহজ এই সমস্যার জন্য একটি কার্যপ্রণালী আবিষ্কার করেছি, এবং এখনও আমি এর উল্লেখ করে এমন কোনও আলোচনা খুঁজে পাইনি। এটির জন্য পিতা-মাতার ফ্রেমের নিয়ন্ত্রণ প্রয়োজন।

আপনার আইফ্রেমে, বলুন যে আপনি এই আইফ্রেমে চান: src = "http://www.example.com/mypage.php"

ওয়েল, আইফ্রেমে নির্দিষ্ট করার জন্য এইচটিএমএলটির পরিবর্তে, আপনার আইফ্রেমের জন্য এইচটিএমএল তৈরি করতে একটি জাভাস্ক্রিপ্ট ব্যবহার করুন, জাভাস্ক্রিপ্টের মাধ্যমে "বিল্ড টাইম" এর মাধ্যমে প্যারেন্ট ইউআরএলটি পান এবং আপনার এসআরসি টার্গেটের ক্যোরিস্ট্রিং-এ ইউআরএল জিইটি প্যারামিটার হিসাবে প্রেরণ করুন, যেমন তাই:

<script type="text/javascript">
  url = parent.document.URL;
  document.write('<iframe src="http://example.com/mydata/page.php?url=' + url + '"></iframe>');
</script>

তারপরে, নিজেকে একটি জাভাস্ক্রিপ্ট ইউআরএল পার্সিং ফাংশনটি সন্ধান করুন যা ইউআরএল স্ট্রিংকে বিশ্লেষণ করে আপনার পরে থাকা ইউআরএল ভেরিয়েবলটি পেতে, এই ক্ষেত্রে এটি "ইউআরএল"।

আমি এখানে দুর্দান্ত ইউআরএল স্ট্রিং পার্সার পেয়েছি: http://www.netlobo.com/url_query_string_javascript.html


এই উত্তরটি স্ট্যাকওভারফ্লো.com/a/7739035/216084 এর সাথে মিলিত হয়ে কাজটি সম্পন্ন করে।

2
এটি একটি দুর্দান্ত পরামর্শ ছিল। যারা প্যারেন্ট এইচটিএমএল আইফ্রেমে কোড লিখছেন তাদের জন্য এটি বিলটি পাবে। আমরা আমাদের পিক্সেল সফ্টওয়্যারটিতে খুব অনুরূপ কিছু ব্যবহার করেছি।
লাইগামার

ধন্যবাদ!! এটি কার্যকর একটি কার্যকর কাজ যা এখনও ক্রস-সাইট নিয়মকে সম্মান করে।
দ্য উথারসাইড

তবে আপনি কি সার্ভারে এইচটিএমএল এর সমস্ত ইউআরএল আবার লিখতে চান? কারণ অন্যথায় যখন কোনও ব্যবহারকারী আইফ্রেমে কোনও লিঙ্ক ক্লিক করে তখনও এটি অ্যাক্সেসযোগ্য হবে না।
রোল

@ রোল আপনি সার্ভারের সময় এগুলি সমস্ত লিখতে পারেন (সংক্ষেপে, "হার্ড কোড" এই উত্তর), বা এই উত্তরটি আপনি জাভাস্ক্রিপ্টে করতে পারেন, উদাহরণস্বরূপ পৃষ্ঠা লোড হওয়ার পরে এটি পছন্দসই আইফ্রেমে ইনজেকশন দেয়।
রজারডপ্যাক

34

যদি আপনার আইফ্রেমে অন্য ডোমেন, (ক্রস ডোমেন) থেকে থাকে তবে আপনার কেবল এটি ব্যবহার করতে হবে:

var currentUrl = document.referrer;

এবং - এখানে আপনি মূল url পেয়েছেন!


এটি আমার ক্ষেত্রে কার্যকর হয়নি কারণ আমি মনে করি আইফ্রেমটি নিজেই গতিশীলভাবে তৈরি হয়েছে বা অন্য কোনও কৌশল হয়েছে। আমি কোনও হারে প্রত্যাশিত উত্তর পাই নি।
মুস্কি

এটি সমস্ত ব্রাউজারে কাজ করা উচিত। আপনি যদি স্যান্ডবক্সিং পরামিতি প্রেরণ করেন তবে নতুন ব্রাউজারগুলিতে না থাকলেও আমি সন্দেহ করি এটিই এর ক্ষেত্রে। ক্রস ডোমেন নির্বিশেষে এটি কাজ করে।
gcb

যদি iframe এর ভিতরে থাকা পৃষ্ঠাটি জাভাস্ক্রিপ্টের মাধ্যমে নিজেকে পুনরায় লোড করে (উদাহরণস্বরূপ window.location.reload(true)) এটি আর কাজ করে না। তারপরে রেফারার হ'ল ইফ্রেমে নিজেই ইউআরএল।
মোরি ২

20

একই ডোমেন এবং বিভিন্ন সাবডোমেনের পৃষ্ঠাগুলির জন্য আপনি এটি সেট করতে পারেন document.domain জাভাস্ক্রিপ্টের মাধ্যমে সম্পত্তি ।

প্যারেন্ট ফ্রেম এবং iframe উভয়কেই তাদের ডকুমেন্ট.ডোমেন সেট করতে হবে যা তাদের কাছে সাধারণ।

উদাহরণস্বরূপ www.foo.mydomain.comএবং এবং api.foo.mydomain.comপ্রতিটি এক foo.mydomain.comবা ন্যায়বিচার mydomain.comএবং সামঞ্জস্যপূর্ণ হতে পারে (না, আপনি comসুরক্ষার কারণে উভয়কে সেট করতে পারবেন না ...)

এছাড়াও, নোট করুন যে ডকুমেন্ট.ডোমেন একটি এক রাস্তার রাস্তা। ক্রমে নিম্নলিখিত তিনটি বিবৃতি চালানো বিবেচনা করুন:

// assume we're starting at www.foo.mydomain.com
document.domain = "foo.mydomain.com" // works
document.domain = "mydomain.com" // works
document.domain = "foo.mydomain.com" // throws a security exception

আধুনিক ব্রাউজারগুলি উইন্ডো.পোস্টমেসেজ ব্যবহার করতে পারে উত্স জুড়ে কথা বলতে, তবে এটি আই 6 তে কাজ করবে না। https://developer.mozilla.org/en/DOM/window.postMessage


3
দয়া করে এটি উত্তর হিসাবে গ্রহণ করুন, এখনই এটি উভয়ই সম্ভব এবং এই উত্তরটি গুগল অনুসন্ধানে প্রকাশিত হচ্ছে।
মেটাগ্রাফার

17

নিম্নলিখিত লাইনটি কাজ করবে: document.location.ancestorOrigins[0]এটি পূর্বপুরুষের ডোমেন নামটি দেয়।


Chrome এ করা পরিবর্তনগুলি অনুসরণ করে এখন অনেক ব্রাউজারের সঠিক উত্তর।
ড্যান অ্যাটকিনসন

যদিও পুরো url নয়। কেবলমাত্র ডোমেন
TheMaster

document.location.ancestorOriginsundefinedআমার জন্য ফিরিয়ে দেয়
মিগুয়েল মোটা

ব্রাউজার সমর্থন সম্পর্কে, বিশেষত, 2020 সালের জুলাই পর্যন্ত, গোপনীয়তার উদ্বেগের কারণে পূর্বপুরুষ অরিগিনগুলি ফায়ারফক্সে এখনও সমর্থিত নয়। বাগজিলা বৈশিষ্ট্য অনুরোধ এবং আলোচনা: bugzilla.mozilla.org/show_bug.cgi?id=1085214 । ব্রাউজার সমর্থন: caniuse.com/#search=ancestorOrigins
কলিন মক


2

আমি এই সমস্যা ছিল। পিএইচপি এর মতো কোনও ভাষা ব্যবহার করা হলে আপনার পৃষ্ঠাটি প্রথমে iframe গ্র্যাবে লোড হয়$_SERVER['HTTP_REFFERER'] এবং এটি একটি সেশন ভেরিয়েবলে সেট করে।

এই পৃষ্ঠাটি যখন iframe এ লোড হয় আপনি পৃষ্ঠাটির পূর্ণ প্যারেন্ট URL এবং ক্যোয়ারী স্ট্রিংটি জানেন যা এটি লোড করেছে। ক্রস ব্রাউজার সুরক্ষার সাথে এটি উইন্ডোতে গণনা করা কিছুটা মাথা ব্যথা p পিতামহিত কিছু যদি আপনি আলাদা ডোমেন করেন তবে।


2
var url = (window.location != window.parent.location) ? document.referrer: document.location;

আমি দেখতে পেয়েছি যে উপরের উদাহরণটি পূর্বে কাজ করেছিল যখন স্ক্রিপ্টটি একটি আইফ্রেমে সম্পাদন করা হয় তবে এটি যখন url পুনরুদ্ধার করে না যখন স্ক্রিপ্টটি একটি iframe এর বাইরে কার্যকর করা হয়, তখন সামান্য সামঞ্জস্য প্রয়োজন:

var url = (window.location != window.parent.location) ? document.referrer: document.location.href;

2
আপনি যদি iframe এর বাইরে থাকেন তবে আপনি স্ক্রিপ্টটি প্যারেন্ট ফ্রেমে চালাচ্ছেন, আপনার কিছু পরীক্ষা করার দরকার নেই।
আর্ট

1

আমি কাজের পূর্ববর্তী সমাধান পেতে পারি না তবে আমি জানতে পেরেছিলাম যে আমি উদাহরণস্বরূপ যদি iframe scr সেট http:otherdomain.com/page.htm?from=thisdomain.com/thisfolderকরি তবে আমি thisdomain.com/thisfolderনীচের জাভাস্ক্রিপ্ট ব্যবহার করে iframe এক্সট্র্যাক্ট করতে পারি :

var myString = document.location.toString();
var mySplitResult = myString.split("=");
fromString = mySplitResult[1];

1

পিএইচপি $ _SERVER ['HTTP_REFFERER'] এর সাথে সমস্যাটি হ'ল এটি সেই পৃষ্ঠার সম্পূর্ণরূপে যোগ্যতাসম্পন্ন পৃষ্ঠা url দেয় যা আপনাকে প্যারেন্ট পৃষ্ঠায় নিয়ে এসেছিল। এটি প্যারেন্ট পৃষ্ঠার মতো নয়। সবচেয়ে খারাপ, কখনও কখনও কোনও http_referr থাকে না কারণ ব্যক্তি পিতামাতার পৃষ্ঠার url এ টাইপ করে। সুতরাং, আমি যদি ইয়াহু ডটকম থেকে আপনার পিতামাতার পৃষ্ঠায় পৌঁছে যাই, তবে ইয়াহু ডট কম আপনার পৃষ্ঠায় নয়, তবে http_referer হয়ে যায়।


1

আমি যেসব ক্ষেত্রে $_SERVER['HTTP_REFERER']কাজ করে না সে ক্ষেত্রে খুঁজে পেয়েছি (আমি আপনাকে দেখছি, সাফারি), $_SERVER['REDIRECT_SCRIPT_URI']একটি দরকারী ব্যাকআপ ছিল।


0

ক্রোমে অবস্থানের ব্যবহার করা সম্ভব anceঅ্যান্টোর অর্গিনস এটি সমস্ত পিতামাতার ইউআরএলগুলি ফিরিয়ে দেবে


0

আমি জানি তার বয়স পুরানো তবে এটি আমার মনকে ফুটিয়ে তোলে যে কেউ কেবল একটি ডোমেন থেকে অন্য ডোমেনে কুকি পাস করার পরামর্শ দেয় না। আপনি যেমন সাবডোমেন ব্যবহার করছেন আপনি কেবল ইউআরএল-এ কুকিজ সেট করে বেস ডোমেন থেকে সমস্ত সাবডোমেনের কাছে কুকি ভাগ করতে পারেন.basedomain.com

তারপরে আপনি কুকিজের মাধ্যমে আপনার যা প্রয়োজন ডেটা ভাগ করতে পারেন।


-1

এটি আমার জন্য iframe src url অ্যাক্সেস করার জন্য কাজ করেছিল।

window.document.URL

-4

সমস্ত অভিভাবক ইফ্রেমে ফাংশন এবং এইচটিএমএল পান

var parent = $(window.frameElement).parent();
        //alert(parent+"TESTING");
        var parentElement=window.frameElement.parentElement.parentElement.parentElement.parentElement;
        var Ifram=parentElement.children;      
        var GetUframClass=Ifram[9].ownerDocument.activeElement.className;
        var Decision_URLLl=parentElement.ownerDocument.activeElement.contentDocument.URL;

আমি মনে করি না আপনি আমাদের মধ্যে যারা jQuery ব্যবহার করেন না তাদের জন্য এই উত্তরটি প্রসারিত করতে পারেন (একটি ক্রমবর্ধমান সংখ্যা, আমার উল্লেখ করা উচিত, যেহেতু jQuery গত কয়েক বছর ধরে অপ্রয়োজনীয় হয়ে উঠেছে)। খুব কমপক্ষে, আমি এটিকে পরিষ্কার করার পরামর্শ দিচ্ছি যে এই উত্তরটি jQuery এর উপর নির্ভরশীল এবং ওপি jQuery এর কোনও উল্লেখ করেনি।
কর্নিক্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.