Ενημερώσεις

Jsonp και YQL για Mashups και XSS

To πρόβλημα: Same Origin Policy.

Όπως θα γνωρίζετε ήδη οι περισσότεροι, ένας σοβαρός περιορισμός των client-side τεχνολογιών (Javascript, AJAX..), είναι το Same Origin Policy. Με λίγα λόγια, οι browsers δεν επιτρέπουν την χρήση scripts που δεν προέρχονται από το ίδιο domain, subdomain και port. Πολύ απλά δηλαδή όταν είσαι στο http://mysite.com δεν μπορείς να ζητήσεις εκτέλεση script που προέρχεται από οποιοδήποτε άλλο domain (http://yoursite.com), subdomain (http://www.mysite.com) ή σε άλλο port (https://mysite.com:81).

Σε μια προσπάθεια να ξεπεραστεί αυτό ο περιορισμός, έχουν επιστρατευθεί κατά καιρούς πολλές λύσεις όπως: 1) η χρήση proxy servers με βασικό ελάττωμα ότι δεν είναι βιώσιμη λύση για scalable εφαρμογές, 2) η χρήση frames μέσα σε μία εφαρμογή, όπου third-party περιεχόμενο μπορεί να έρθει αλλά και πάλι αυτό το περιεχόμενο δεν θα είναι προσβάσιμο από την υπόλοιπη εφαρμογή 3) ακόμα και λύσεις που εμπλέκουν flash τεχνολογία η οποία διαθέτει διαφορετικό cross domain policy

JSON with padding και Cross Site Scripting

Εδώ θα παρουσιάσουμε μία διαφορετική λύση, που βασίζεται στο γεγονός ότι το Same Origin Policy δεν απαγορεύει αυτό που λέμε στα ελληνικά dynamic script insertion. Με λίγα λόγια μια συνάρτηση που εκτελείτε στο current domain μπορεί να πάρει ως όρισμα, την εκτέλεση μιας συνάρτησης που βρίσκεται σε άλλο αρχείο, σε άλλο domain και γενικά οπουδήποτε. Ένα σύντομο παράδειγμα για να γίνει κατανοητό αυτό:

Στο http://yoursite.com/foo.js έχουμε την μοναδική γραμμή Javascript κώδικα

showFetchedData({ temperature: '35.2'}); 

Στο http://mysite.com/test.html έχουμε τον κώδικα

 <script type="text/javascript">
function showFetchedData(data) {
    alert("The temperature is " + data.temperature);
}
</script> <script type="text/javascript" src="http://yoursite.com/foo.js"></script>
 

Με την παραπάνω τεχνική καταφέραμε ουσιαστικά, να μεταφέρουμε το δεδομένο ότι η θερμοκρασία είναι 35.2 βαθμοί, που δίνεται από την υπηρεσία του yoursite, στο mysite.!! Σε μια εξέλιξη του παραπάνω, θα μπορούσαμε να έχουμε πολλά δεδομένα στη κλίση της showFetchedData και να τα μεταφέρουμε στο δικό μας domain με μόνη προϋπόθεση να έχουμε ήδη ορίσει την showFetchedData στην δικιά μας πλευρά. Αυτή η σύνταξη των δεδομένων ονομάζεται JSONP (JSON with padding) και δεν είναι τίποτα άλλο από μια συνάρτηση με όρισμα δεδομένα σε μορφή JSON.

Mashups με YQL και Jquery.getJson()

Ωραία όλα αυτά, αλλά πόσες υπηρεσίες υπάρχουν που επιστρέφουν δεδομένα σε μορφή JSOΝP? Καλώς ή κακώς όχι πολλές.. Και εδώ έρχεται η χρήση της YQL. H Yahoo Query Language, μεταξύ των άλλων προσφέρει και την υπηρεσία data, που ουσιαστικά δέχεται query που ζητάει μια οποιαδήποτε ιστοσελίδα + (προαιρετικά) XPATH και επιστρέφει τα δεδομένα σε μορφή JsonP.

ibm

yql

Όπως βλέπουμε μας επιστρέφει σε μορφή JsonP τα στοιχεία της εικόνας. Το μόνο που θα μας έλειπε θα ήταν ο ορισμός της showFetchedData. Αυτή την διαδικασία την αναλαμβάνει η jquery.getJson

 
$.getJSON("http://query.yahooapis.com/[ το YQL query ]&format=json&amp;callback=?", function(data){     
// data διαθέσιμο εδώ!!     
// manipulating data.query.results.img 
}); 

H YQL μας επιτρέπει να ορίσουμε το όνομα της callback συνάρτησης (της showFetchedData στα παραδείγματά μας) όμως επιλέγουμε ? ώστε να έχουμε τα δεδομένα διαθέσιμα στην συνάρτηση-όρισμα της getJson όπως φαίνεται και στο παράδειγμα.
Τέλος εδώ. Ελπίζω στο μέλλον να πούμε περισσότερα τόσο για τα client-side mashups όσο και για την YQL, που αποτελεί την απόδειξη ότι η Yahoo, όσο και αν πέφτει η μετοχή της, παρέχει ακόμα κορυφαίες υπηρεσίες.

16 Νοε 09 - 20:08 // Bookmark and Share

6 Σχόλια

Εικόνα: PanosJee

Ξεστραβωτικό άρθρο! Περιμένουμε συνέχεια για YQL

Τρί, 11/17/2009 - 16:58
Εικόνα: dizzy_fingers

Αυτά είναι, τέτοια να διαβάζουμε :D.

Επειδή είμαι ρούκης ακόμα σε αυτά τα πράματα, να υποθέσω πως είναι ορισμένα τα site που απαντάνε "σωστά" στα request μας ή αναλαμβάνει η υπηρεσία της Yahoo να κάνει όλο το scraping?

Επίσης, ποιό είναι το κόστος αυτής της τεχνικής στο χρόνο φόρτωσης των δεδομένων (θέλω σύγκριση με server-side scraping, αν στέκει τέτοια σύγκριση)

Υπάρχουν κάποια site παραδείγματα που να μας δείχνουν real time αυτήν την τεχνική? (να υποθέσω πως τα posted links στο facebook είναι ένα?)

Αυτά τα λίγα για αρχή :P.

Τρί, 11/17/2009 - 17:16
Εικόνα: Savvas Georgiou

Για το πρώτο που ρωτάς, η YQL "κατεβάζει" όλο το document και αν δεν ορίσεις εσύ κάποιο xpath, θα στο στείλει όλο πίσω απλά δομημένο ως DOM.. Δίνει όμως την τρομερή δυνατότητα να ορίσεις Xpath ωστε να πάρεις ακριβώς αυτό που θέλεις γλιτώνοντας bandwidth κυρίως..

Για το "κόστος" δεν έχω κάνει και πολλές δοκιμές είναι η αλήθεια.. Προφανώς είναι πιο αργό απο server-side τεχνικές απλά η ελπίδα κρύβεται στο να κάνεις μια κατανεμημένη εφαρμογή scraping και να δουλεύεις από πολλούς και ανυποψίαστους επισκέπτες της σελίδας σου, σε παρόμοια λογική που γίνονται και τα flash banners για κατανεμημένη επεξεργασία.

Για το 3ο μπορώ να ψάξω και άλλο και αν βρω κάτι θα απαντήσω.. Εγώ την βρήκα την τεχνική για ένα προσωπικό project και σαν feedback έχω να πώ ότι έκανα scrape σε 27.000 wiki pages μέσα σε λίγες ώρες και τις 27.000 φορές η YQL απάντησε απροβλημάτιστα!

Τρί, 11/17/2009 - 19:42
Εικόνα: PanosJee

όπα
map-reduce με YQL
πολύ ενδιαφέρον!

Τρί, 11/17/2009 - 19:46
Εικόνα: Ανώνυμος

Γιατί δεν είναι βιώσιμη η λύση των proxy servers σε scalable εφαρμογές??

Εννοώ βέβαια custom made server side proxy, ο οποίος "μιλάει" με τους content providers και δίνει τα data έτοιμα στον client. Προσωπικά, το έχω υλοποιήσει σε project που μπορεί να τρέχει σε Load Balanced/HA servers και με τη χρήση array από memcached servers, για caching των responses που δεν αλλάζουν συχνά (π.χ. photos, videos, weather κλπ) η εφαρμογή "πετάει", παρόλο που μιλάει σε 18 xml services, εκ των οποίων μέχρι 7 ταυτόχρονα (αυτή τη στιγμή... μην ξεχνάμε το scalability)

Τετ, 11/18/2009 - 10:16
Εικόνα: Savvas Georgiou

Με το customization που περιγράφεις αναμφισβήτητα γίνεται μια χαρά βιώσιμη η λύση του proxy.. Το scalability το έθεσα ως γενική αδυναμία των proxies αλλά σίγουρα οι αδυναμίες είναι για να ξεπερνιούνται :P. Γενικά υποθέτω ότι όλες οι λύσεις στο XSS έχουν αδυναμίες αφού είναι κάτι που δεν προβλέπεται..

Πάντως αν μιλάς για το spotahotel, πράγματι "πετάει" από όσο είδα..

Τετ, 11/18/2009 - 18:10

Πες μας την βασιλική σου γνώμη

Το περιεχόμενο αυτού του πεδίου παραμένει ιδιωτικό και δε θα εμφανίζεται δημόσια. If you have a Gravatar account, used to display your avatar.
  • Διευθύνσεις ιστού και e-mail μετατρέπονται αυτόματα σε παραπομπές.
  • Επιτρεπόμενες ετικέτες HTML: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <h2> <h3> <h4> <p> <img> <code> <blockquote>
  • Αυτόματες αλλαγές γραμμών και παραγράφων.
  • You can enable syntax highlighting of source code with the following tags: <code>, <blockcode>, <c>, <cpp>, <css>, <drupal5>, <drupal6>, <html>, <java>, <javascript>, <php>, <python>, <robots>, <ruby>, <sql>, <xml>. The supported tag styles are: <foo>, [foo].

Περισσότερες πληροφορίες για τις επιλογές μορφοποίησης

© 2006-2010 Webz.gr | Designed by Alexander Lingris
Feedback