Ας ρίξουμε μια ματιά στις ακόλουθες δύο διευθύνσεις URL, περνούν τις ίδιες παραμέτρους; aaa.aspx?tag=.net%bc%bc%ca%f5 aaa.aspx?tag=.NET%E6%8A%80%E6%9C%AF
Φαίνεται να είναι διαφορετικό, αλλά στην πραγματικότητα, όλοι χρησιμοποιούν UrlEncode για "τεχνολογία .net", αλλά το ένα είναι κωδικοποίηση GB2312 και το άλλο είναι κωδικοποίηση Utf-8. Ο ακόλουθος κώδικας μπορεί να αποκτήσει το παραπάνω εφέ κωδικοποίησης:
συμβολοσειρά tmp1 = System.Web.HttpUtility.UrlEncode(".net technology", System.Text.Encoding.GetEncoding("GB2312")); συμβολοσειρά tmp2 = System.Web.HttpUtility.UrlEncode(".net technology", System.Text.Encoding.UTF8);
Οι πραγματικές ιστοσελίδες μας ενδέχεται να καλούνται από άλλα προγράμματα. Για παράδειγμα, απλοποιημένα κινεζικά μια σελίδα ASP στο λειτουργικό σύστημα πρέπει να μεταβιβάσει μια παράμετρο κινεζικών σε μια σελίδα ASP.net. Από προεπιλογή, στα απλοποιημένα λειτουργικά συστήματα Κινεζικών, η μέθοδος Server.UrlEncode του ASP θα κωδικοποιήσει τα Κινεζικά με κωδικοποίηση GB2312. Αλλά από προεπιλογή, ASP.net σελίδες είναι κωδικοποιημένες σε UTF-8. Σε αυτήν την περίπτωση, όταν χρησιμοποιείτε το Request.QueryString["Tag"] για να αποδεχτείτε την τιμή, δεν θα μπορείτε να αποδεχτείτε κινεζικές πληροφορίες και θα δείτε αλλοιωμένους χαρακτήρες στον εντοπισμό σφαλμάτων βήμα προς βήμα. Προς το παρόν, παρόλο που το Request.QueryString["Tag"] είναι αποδεκτό με αλλοιωμένους χαρακτήρες, η διεύθυνση URL αυτή τη στιγμή δεν είναι αλλοιωμένη.
Η λύση είναι να αναλύσετε μόνοι σας τις παραμέτρους στη διεύθυνση URL και, στη συνέχεια, να αποκρυπτογραφήσετε τις τιμές των παραμέτρων σύμφωνα με την κωδικοποίηση του GB2312, αντί να χρησιμοποιήσετε την προεπιλεγμένη κωδικοποίηση UTF-8 του .net. Στην πραγματικότητα, η Microsoft παρέχει ομοίως αντίστοιχες λειτουργίες, επομένως δεν χρειάζεται να χρησιμοποιούμε κανονικές εκφράσεις για να αναλύσουμε μόνοι μας τις συμβολοσειρές URL.
Ο κωδικός επίδειξης έχει ως εξής:
συμβολοσειρά q = Request.Url.Query;
System.Collections.Specialized.NameValueCollection nv = System.Web.HttpUtility.ParseQueryString(q, System.Text.Encoding.GetEncoding("GB2312")); Response.Write(nv["Tag"]);
Ας χρησιμοποιήσουμε το .NET Reflector του Lutz Roeder για να δούμε την υλοποίηση της μεθόδου System.Web.HttpUtility.ParseQueryString: Αν συνεχίσουμε να ελέγχουμε, μπορούμε να δούμε ότι ο κώδικας που τελικά χειρίζεται την ανάλυση συμβολοσειράς παραμέτρων URL είναι ο εξής:
Η ακόλουθη συνάρτηση της κλάσης System.Web.HttpValueCollection υλοποιεί την ανάλυση της παραμέτρου URL Εδώ βλέπουμε ότι είναι μια ανάλυση που πραγματοποιείται από κάθε χαρακτήρα.
Όσο για το είδος της μεθόδου κωδικοποίησης που μας περνά το άλλο μέρος, είναι καλύτερο να το περάσουμε ως παράμετρο, ώστε να μπορούμε να το αποκρυπτογραφήσουμε σύμφωνα με αυτήν την παράμετρο του χρήστη. |