שימוש בתו נטוי בכתובות אתרי אביב

1. הקדמה

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

אביב במיוחד יכול להיות קצת מסובך בהקשר זה בגלל תצורות ברירת המחדל שהוא מספק.

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

2. לנתח את הבקשה באופן ידני

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

בואו נגיד שנוכל לקבל בקשות בכל דרך שמתחת / mypaths:

// localhost: 8080 / mypaths / any / custom / path

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

הפיתרון הראשון שכנראה יעלה בראשנו הוא לכידת החלק הדינמי של הדרך אל a PathVariable:

@GetMapping ("mypaths / {anything}") ציבורי מחרוזת pathVariable (@PathVariable ("כל דבר") מחרוזת כל דבר) {להחזיר כל דבר; }

למרבה הצער, אנו מגלים זאת במהרה זה מחזיר א 404 אם ה PathVariable מכיל קו נטוי. התו הנטוי הוא תיחום הנתיב הסטנדרטי של ה- URI, וכל מה שאחריו נחשב לרמה חדשה בהיררכיית הנתיבים. כצפוי, אביב עוקב אחר תקן זה.

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

@GetMapping ("כל / **") ציבורי מחרוזת allDirectories (HttpServletRequest בקשה) {return request.getRequestURI () .split (request.getContextPath () + "/ all /") [1]; }

ואז עלינו לנתח את ה- URI בעצמנו על מנת לקבל את החלק של הדרך בה אנו מעוניינים.

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

3. השתמש בפרמטרים של שאילתה

בניגוד לדוגמא הקודמת שלנו, ישנם מקרים אחרים שבהם אנחנו לא רק ממפים נתיבים שונים אלא מקבלים כאלה חוּט כפרמטר בכתובת האתר.

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

//localhost:8080/all///myurl.com

בהתחלה, היינו יכולים לחשוב שזה אמור לעבוד, אך עד מהרה אנו מבינים שהבקר שלנו חוזר http: /myurl.com. זה קורה בגלל Spring Security מנרמל את כתובות ה- URL ומחליף כל קו נטוי כפול בכתובת אחת.

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

במקרים אלה, מומלץ להשתמש במקום זאת בפרמטרים של שאילתה:

@GetMapping ("הכל") queryParameter ציבורי (@RequestParam ("param") מחרוזת מחרוזת) {return param; }

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

4. הימנע מדרך לעקיפת הבעיה

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

הפיתרון הנפוץ ביותר הוא ככל הנראה קידוד קו נטוי בפרמטרי הנתיב. למרות זאת, בעבר דווח על כמה נקודות תורפה של אבטחה ורוב שרתי האינטרנט והיישומים הגיבו עליה על ידי ביטול הלוכסנים המקודדים כברירת מחדל. עדיין ניתן לשנות התנהגות זו רק על ידי שינוי ההגדרה המתאימה, כמו ב- Tomcat.

אחרים כמו Apache Server הרחיקו לכת והציגו אפשרות לאפשר קו נטוי מקודד מבלי לפענח אותם כדי שלא יתפרשו כמפריד נתיבים. בכל מקרה, זה לא מומלץ והוא יכול להכניס סיכוני אבטחה פוטנציאליים.

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

לבסוף, ישנם סוגים אחרים של דרכים לעקיפת הבעיה כמו שינוי נורמליזציה של ה- URI ש- Spring מספק כברירת מחדל. כמו בעבר, עלינו להיות זהירים מאוד אם נשנה את ברירות המחדל הללו.

5. מסקנה

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

ככלל אצבע, פרמטרים של שאילתות הם בדרך כלל הפיתרון הטוב ביותר להתמודדות עם קו נטוי בכתובות אתרים.

כמו תמיד, קוד המקור המלא של הדוגמאות זמין ב- GitHub.


$config[zx-auto] not found$config[zx-overlay] not found