כדי שהשרת יזהה לקוח באמצעות $_SERVER['HTTP_HOST']
-
אני עושה מערכת שאוכל לפתוח אותה לכמה לקוחות שלכל אחד יהיה דומיין נפרד. השרת כרגע מזהה את המערכת לפי המשתנה $_SERVER['HTTP_HOST'].
שאלות:
-
אני לא יודע מה המנגנון של HTTP. אז האם שייך 'לזייף' דהיינו לפנות לשרת בדומיין X כאשר בפניה מגדירים מידע של דומיין אחר למשתנה $_SERVER['HTTP_HOST']? (אני מאמין שלא, רק רוצה להיות בטוח).
-
האם צריך / כדאי לעשות עוד הפרדה בתוך השרת שיהיה לכל דומיין דברים נפרדים (אני מעלה אפשרויות: שרת אפאצ'י נפרד לכל דומיין / IP נפרד, או משהו אחר)? וא"כ אז אם אפשר כיוון ל'איך עושים את זה'?
תודה.
-
-
בודאי שאפשר לזייף, בעיקרון הבקשה ב HTTP פונה לכתובת IP, וכלול בבקשה header בשם HOST שאומר לשרת לאיזה דומיין הלקוח מעוניין לפנות, והשרת עושה את הסינון שלו לפי ההגדרות שלו.
אם אתה רוצה לאבטח מידע, אתה חייב להשתמש במערכת אימות ועוגיות אותנטיקה, אין לי מושג איך עושים את זה ב PHP -
בכלל דומיין זה לא דבר חסוי, זה רשום בשרתי DNS ציבוריים וכל הרוצה מקבל מידע, אפשר לקבל בקלות את הרשימה של הדומיינים שמפנים לשרת שלך, אז אי אפשר לאבטח מידע בצורה הזו (אא"כ אתה מדבר על רשת אירגונית פנימית עם שרת DNS עצמאי...)
-
@chagold אמר בכדי שהשרת יזהה לקוח באמצעות $_SERVER['HTTP_HOST']:
אני עושה מערכת שאוכל לפתוח אותה לכמה לקוחות שלכל אחד יהיה דומיין נפרד. השרת כרגע מזהה את המערכת לפי המשתנה $_SERVER['HTTP_HOST'].
תודה.אין לי תשובה לשאלות שלך.. אבל אני מנסה להבין איזה בעיה אתה מנסה לפתור:
יש לך מערכת אחת שהיא אותו דבר, אלא שאתה רוצה שלכל לקוח יהיה דומיין משלו.
אתה רוצה שהמערכת תזהה את הלקוח לפי הדומיין.אני לא מבין מדוע אתה רוצה לזהות את הלקוח לפי הדומיין, אתה צריך לזהות את הלקוח לפי שם משתמש וסיסמה, ואז אתה מפנה אותו למערכת עם הנתונים הרלבנטיים אליו.
למיטב ידיעתי, הדרך הסטנדרטית לעשות את מה שאתה רוצה, דהיינו שיש מערכת שהיא אותו דבר, אלא שיש לה כמה לקוחות שונים, יש ב' אפשרויות (שהם די דומות):
אפשרות א. יש דטהבייס משותף לכל הלקוחות, ולכל רשומה יש שדה עם מזהה של הלקוח, ככה שאתה שולף רק את השדות של אותו לקוח.
אפשרות ב. יש לכל לקוח דטהבייס נפרד לחלוטין, ויש דטהבייס נוסף שמחזיק את הנתונים של המשתמש + הקונקשיין סטרינג של הדטהבייס שלו.ב2 האפשרויות המערכת היא אחת, היא רצה על שרת אחד, ככה שאתה יכול לתת לכל לקוח איזה דומיין שתרצה, אבל בהגדרות הDNS של הדומיין אתה מפנה את כולם לאותה כתובת IP.
המערכת מציגה לכולם את אותו דף התחברות, ואחרי לוגין עם שם משתמש וסיסמה: באפשרות א. היא מביאה לו רק את הנתונים הרלבנטיים אליו. באפשרות ב. היא מחברת אותו לדטה בייס שלו ונותנת לו את הנתונים הרלבנטיים אליו.גם אם יש לך מודולים שלא פתוחים לכל המשתמשים - אתה עדיין יכול לנהל את זה בדטהבייס, ואחרי שאתה מזהה את המשתמש אתה יודע איזה מודולים אפשר להציג לו ואיזה לו.
-
@יוסף-בן-שמעון עשיתי מערכת של סשנים.
ולפי מה שאתה אומר, אז אצלי כיון שבעצם הנתונים מתקבלים כמו API, אני יכול לסנן את הדומיין הרלוונטי לפי הheader HOST.@dovid שתי שאלות על ngnix:
-
ענית לשאלה איך אפשר לעשות, או האם אני מרוויח מזה? כי אם כן, מה באמת הרווחתי? (בכ"א אפשר לעקוב אחרי רשימת הכתובות שמפנות לIP שלי כמו ש@יוסף-בן-שמעון כתב). אא"כ כוונתך ע"י הngnix לעשות location לשרתים אחרים?
-
כדי לעשות location לשרתים אחרים, האם יש אפשרות לעשות את הניתובים ע"י שימוש בסקריפט, או שחייב להיות שכל פעם שיש לקוח חדש אז אצטרך להוסיף קבצים ולעשות ריסטרט לngnix?
תודה
-
-
@chagold אני לא מבין בדיוק מה אתה עושה, לכן אני לא יכול לענות לך בדיוק.
בגדול אם נח לך יישום אחד לכל הלקוחות, אלא שלפי הדומיין אתה רוצה שהיישום יטפל בבקשה, אז אתה לא צריך ngnix (זה סתם תמיד מומלץ אבל לא נוגע לעכשיו) וכפי שאמרת אתה יכול לבדוק את ההידר host.
(אני מבין שאתה בעצם עושה מה ש@avr416 הציע באפשרות השניה רק שבמקום ללכת לפי משתמשים אתה מתייחס לדומיינים, ו@avr416 שים לב שזה יכול לחסוך מסד של משתמשים גלובלי כי לפי הדומיין מתחברים למסד המתאים בו יש משתמשים רק של אותו לקוח).
אם אתה רוצה יישום לכל לקוח, כלומר שאם לקוח אחד למשל גורם לשגיאה והיישום נופל אז של הלקוח השני ימשיך לעבוד, אז אתה בעצם מריץ מופעים של יישומים כמספר הלקוחות. היישומים לא יכולים להאזין לפורט 80 כי רק יישום אחד יכול לטפל בפורט נתון, פה בא הnginx ומאפשר לך להאזין בפורט 80 למשל לכלל הלקוחות ולפי דומיין להפנות ליישום (פורט) המתאים בתוך השרת.לגבי 2, התשובה היא שכן.
-
@dovid אני מבין שזה חוסך את המסד הגלובלי, אם כי בד"כ בלאו הכי הרבה פעמים יש צורך להחזיק מסד כזה בשביל עוד כמה דברים. כגון אם אתה לא רוצה לאפשר לכל המשתמשים את אותם יכולות של התוכנה, אלא רק למי שעשה מנוי לדברים מסוימים. או אם יש לך חבילות לפי שימוש וכדו', ואתה רוצה לדעת כמה הלקוח השתמש. זה דברים שלא היית רוצה להחזיק בDB של הלקוח הספציפי, אלא באחד כללי של כל המערכת.