פתרון פרוקסי לתקשורת AJAX בין דומיינים שונים

דוגמא לפתרון מבוסס PHP לנושא ה-Cross Domain ב-AJAX

AJAX, ובמיוחד AJAX עם jQuery הוא אחת הדרכים המובילות לקיים אינטראקציה עם המשתמש. על היתרונות של AJAX אין צורך להכביר מילים, אך ל-AJAX יש נקודה חלשה אחת, נושא ה-Cross Domain.

ל-JavaScript, בדומה לפלאש, יש איסור לגשת לדפים הנמצאים על שרת בעל שם דומיין אחר. בניגוד לפלאש, אין לנו יכולת מובנית לעקוף את זה. אם יש לי טופס AJAX על internet-israel.com ואני רוצה שהוא ישלח ויקבל מידע מ-internet-world.com, אין לי דרך לעשות את זה. טופס AJAX עובד אך ורק בדומיין אחד.

איך בכל זאת עושים את זה?

ישנן שלוש דרכים מובילות לעקוף את מגבלת הבטיחות הזו שהושתה על JavaScript. הראשונה היא יצירת פרוקסי. שליחת המידע לדף בשרת שכתוב בשפה ללא מגבלות המאפשרת לו לשלוח מידע אל דומיין אחר, קבלת המידע ושיגורו חזרה אל הסקריפט שלנו. השיטה השניה, המודרנית יותר, נקראת JSONP. לאחר הקריאה במאמר הזה, אפשר לקרוא את המדריך ל-JSONP.

השיטה השלישית היא שימוש בפלאש על מנת לקיים את התקשורת. שיטה זו מוסברת במלואה במאמר על flXHR.

בעוד ששני הפתרונות האחרונים הם בהחלט יותר אלגנטיים, הפתרון של פרוקסי מאפשר לנו לקיים תקשורת עם אתרי אינטרנט שלאו דווקא נבנו על מנת לקיים תקשורת עם סקריפט AJAX או עם פלאש. לדוגמא, אם אני רוצה לסרוק אתר מסוים ולקחת ממנו נתונים רלוונטיים לצורך בניית RSS, השימוש בפרוקסי שידע לקחת את המידע מהאתר השני ולהעביר אותו לסקריפט שלנו הוא קריטי.

קוד פרוקסי לדוגמא:


<?php


// Query string
$fields = '?';

// Prepare the fields for query string, don't include the action URL OR method
foreach ($_REQUEST as $key => $value)
{
    $fields .= $key.'='.$value.'&';
}



// Strip the last comma
$fields = substr($fields, 0, strlen($fields) - 1);

$url = "http://www.othersite.com/page.php".$fields;


// Website url to open
$daurl = $url;
/*
// Get that website is content
$handle = fopen($daurl, "r");

// If there is something, read and return
if ($handle) {
    while (!feof($handle)) {
        $buffer = fgets($handle, 4096);
        echo $buffer;
    }
    fclose($handle);
}
*/

// Get result 
$result = file_get_contents($url);


// Return the response
echo $result;

?>


ועכשיו להסבר. ראשית, אנו מכוונים את היעד של ה-AJAX שלנו (הנה הסבר איך לעשות את זה עם jQuery) אל הפרוקסי שיושב בשרת שלנו. שנית, אנו כותבים את הכתובת שאנו רוצים להגיע אליה ב: http://www.othersite.com/page.php. אנו שולחים את ה-AJAX כרגיל, בצורת post או get. ה-PHP מריץ בדוגמא שלנו את כל שדות ה-request, מצרף אותם כבקשה חדשה וקורא לדף ומחזיר את תוכנו. זה הכל.

הערה חשובה: מבחינת אבטחה אסור באיסור חמור להשתמש בדף הזה שפגיע כמו תינוק בן יומו. על כל שדה ושדה לעבור וולידציה ולעולם אין להשתמש בסקריפט כזה שלוקח את כל השדות שזורקים אליו. הסקריפט הזה הוא לצורך דוגמא ולימוד בלבד. אם אתם לא יודעים למה הוא פגיע, פנו לאיש PHP ואל תשתמשו בו.

פוסטים נוספים שכדאי לקרוא

פתרונות ומאמרים על פיתוח אינטרנט

המנעו מהעלאת source control לשרת פומבי

לא תאמינו כמה אתרים מעלים את ה-source control שלהם לשרת. ככה תמצאו אותם וגם הסבר למה זה רעיון רע.

עבודה בהיי טק

איך מראיינים סניורים?

השיטה שלי לבדיקת התאמה טכנית למתכנתות ולמתכנתים בכירים עם כמה שנות ניסיון.

גלילה לראש העמוד