מאמר 9: הרחבות SSI / פנקג' קמת'ן.
ישנם מקרים שונים בהם רוצים ליצור מסמך עם כמות מינימלית של מידע דינמי, למשל הצגת השעה והתאריך הנוכחיים.
קיימות דרכים רבות לעשות זאת בעזרת אינטראקציות עם השרת. אופציה אחת היא כתיבת CGI script - אך אין צורך בכך. ניתן להשתמש ב - SSI, או הרחבותיה - XSSI.
הערה: כאשר מסומן X) SSI) הכוונה לתכונות התקפות הן ב- SSI והן ב- XSSI .
9.2 תוספות בצד השרת ( SSI )
ה- SSI הראשונים הוצגו בשרת NCSA, שקדם לאפאצ'י. מדובר בפקודות שניתן למקם בתוך מסמכי ה- HTML שלך כדי להריץ תוכניות אחרות או פלטים של נתונים, כגון משתני סביבה ונתונים סטטיסטיים על הקבצים.
לדאבוננו, לא כל השרתים תומכים בפקודות אלו. למשל שרת ה - CERN אינו תומך ב- SSI.
9.2.1 היתרונות לתוספות-שרת
* "אין תפרים" - השימוש בתוספות שרת הוא נעדר כל תפר מבחינת המשתמש. כמו
כן, כיוון שהתוספות מתבצעות בצד השרת, הצפיה במסמך המקור אינה חושפת את
השימוש בהן.
* קלות ועלות הפיתוח - במקרים רבים, תוספות שרת הן חלופה טובה ל- CGI וזאת
משני טעמים: 1. קל יותר לפתח ולתחזק תוספות והדבר דורש פחות זמן.
2. השימוש בתוספות שרת עשוי לצמצם עלויות תחזוקה ופיתוח של
הקוד.
* ניהול האתר - יש מידע מגוון שבד"כ כלול במסמכי HTML, אם ע"י הכרח או על-פי
סטנדרטים מקובלים, כמו: הודעה על זכויות יוצרים, קישור לשמו ולכתובת ה -
e-mail של הכותב וכן שם הארגון. מידע כזה בד"כ חוזר על עצמו ואם מדובר באתר
גדול, דרושה עבודה רבה להכניס מידע זה לכל עמוד. כמו כן, כשהמידע משתנה, יש
לשנותו בכל עמוד- עבודה רבה ומיותרת, וכן הדבר מגדיל את הסיכויים לשגיאות.
בעזרת שימוש ב- SSI, ניתן לעשות מטלות אלה אוטומטית, וכן לצמצם את הבעיות
הנלוות להן.
אפשר להשתמש ב- Emacs with html-helper-mode כדי לערוך HTML וקבצים הכוללים פקודות SSI, אך אין בו תמיכה ספציפית ל - SSI.
9.2.3 משתני הסביבה של SSI
כל משתני הסביבה הזמינים לתוכניות CGI , זמינים גם לשימוש בפקודות SSI.
כמו כן ישנם שישה משתני סביבה נוספים הזמינים בלעדית לפקודות SSI:
|
משתנה הסביבה | תיאור |
DATE_GMT | התאריך והזמן הנוכחיים לפי שעון גריניץ |
DATE_LOCAL | התאריך והזמן הנוכחיים לפי אזור הזמן המקומי |
DOCUMENT_NAME | שם הקובץ הנוכחי |
DOCUMENT_URI | נתיב וירטואלי למסמך (יחסית לשורש (root) המסמך) |
LAST_MODIFIED | התאריך והזמן האחרונים בהם שונה המסמך הנוכחי |
QUERY_STRING_ UNESCAPED | מחרוזת שאילתא לא מפוענחת עם כל תווי העל של "\" - תחומים ב shell - ה |
|
המסמך מנותח כמו מסמך HTML, כשכל פקודות התוספת משובצות בהערות SGML בתוך המסמך (זאת במקרה שהמסמך ישלח אי פעם מבלי שיחולק וינותח).
לכל פקודה יש הפורמט הבא:
|
<!--#command parameter="argument"-->
|
|
כל פקודה מקבלת פרמטרים שונים ורובן יכולות לקבל פרמטר אחד בלבד בכל פעם.
כל פקודת SSI מתחילה ב- #. כל פרמטר לפקודה, המכונה תג או ארגומנט, מסתיים
בסימן = ואז מופיע ערכו. להלן נדון בתחביר ובמשמעות של כל פקודת SSI.
פקודה זו מפקחת על היבטים שונים בחלוקת הקובץ ומאפשרת לבחור את שיטת ההצגה של הודעות השגיאה, מידע על גודל הקובץ, הזמן והתאריך הרלוונטיים.
יש שלושה ארגומנטים תקפים לפעולה זו:
errmsg מפקח על ההודעה שנשלחת חזרה ללקוח אם מתרחשת שגיאה בעת חלוקת וניתוח הקובץ. כששגיאה מתרחשת, היא נרשמת ב - error log של השרת.
sizefmt קובע את הפורמט להצגת גודל הקובץ, האפשרויות הן: bytes או abbrev עבור גרסה מקוצרת (ב- KB או MB).
timefmt מעניק לשרת פורמט חדש עבור תאריכים. זוהי מחרוזת התואמת לקריאה לספריית strftime ברוב הגרסאות של UNIX.
דוגמאות:
אם נשתמש בפקודת include כדי להוסיף קובץ שאינו קיים, השרת יפיק פלט (ברירת המחדל) של הודעת שגיאה בצורה הבאה:
|
[an error occurred while processing this directive]
|
|
ניתן לשנות הודעה זו בעזרת פקודת config. אם נרצה לשנות את ההודעה לנוסח הבא:
"Error. Please contact einstein@ias.edu", נבצע:
|
<!--#config errmsg="Error. Please contact einstein@ias.edu."-->
|
|
ניתן להגדיר את הפורמט להצגת גודל הקובץ ע"י השרת, בעזרת פקודת fsize.
למשל: |
<!--#config sizefmt="abbrev"-->
|
|
פקודה זו תגרום לשרת להציג את גודל הקובץ, מעוגל לקילובית (K) הקרוב. כדי להציג את גודל הקובץ בצורת בתים ניתן להשתמש בארגומנט "bytes", בצורה הבאה:
|
<!--#config sizefmt="bytes"-->
|
|
פקודה זו מחזירה את הערך של משתני SSI מיוחדים וכן משתני סביבה אחרים.
כל התאריכים הרלוונטיים יודפסו בכפוף לפורמט הקיים של timefmt.
לפקודה זו יש רק פרמטר אחד, var, אשר ערכו הוא שם המשתנה עליו רוצים לבצע echo.
דוגמאות:
|
<!--#echo var="DOCUMENT_NAME"-->
<!--#echo var="DOCUMENT_URI"-->
<!--#echo var="LAST_MODIFIED"-->
|
|
בחלק זה של המסמך, בו מופיע הטקסט הנ"ל, יוצג שם המסמך, ה - URL .(אף שהמשתנה מכונה DOCUMENT_URI) והתאריך האחרון בו עודכן המסמך.
בדוגמא הבאה, מוצגים שם ה - IP או כתובת השרת, שם המארח (host) המרוחק והזמן המקומי:
|
<!--#echo var="SERVER_NAME"-->
<!--#echo var="REMOTE_HOST"-->
<!--#echo var="DATE_LOCAL"-->
|
|
פקודה זו משבצת טקסט של מסמך לתוך מסמך מנותח. כל קובץ שהתווסף כפוף לבקרת הגישה הרגילה. פקודה זו ממלאת את אותה הפונקציה ב- HTML כפי שהיא עושה בשפות כגון C או ++C, דהיינו, היא תורמת למודולריות ולתחזוקת הקוד ע"י קביעת כל הפריטים שאמורים להופיע כמעט בכל עמוד, בקבוצה קטנה של קבצים והכללת הפנייה לקובץ המתאים, במקום לחזור על תוכן הקובץ בכל עמוד.
לפקודה זו יש שני ארגומנטים תקפים:
1. file - ארגומנט זה משמש להוספת קובץ שנמצא באותה ספרייה כמו המסמך. הוא מגדיר את שם הנתיב יחסית לספריה הנוכחית. אמנם קל להשתמש בו אך הוא מחייב זהירות יתרה. אסור להשתמש בשמות נתיב כגן "/.." או נתיבים אבסולוטיים.
אפשר לשלוח מסמכים מנותחים אחרים, אך אי אפשר לשלוח CGI scripts.
2.vitrual - ארגומנט זה משמש לתת גישה לנתיב וירטואלי למסמך על השרת. אם הארגומנט לא מתחיל ב - "/" אזי מתייחסים אליו יחסית למסמך הנוכחי.
ניתן לגשת למסמך רגיל או למסמך מנותח אחר באמצעות ארגומנט זה, אך לא ניתן לגשת
ל - CGI script בצורה זו.
דוגמא:
|
<!--#include file="foo.txt"-->
<!--#include virtual="/path_to/foo.txt"-->
|
|
פקודות exec מריצות תוכניות חיצוניות ומכניסות את הפלט לתוך המסמך הנוכחי.
חייבים להפעיל את הפקודה כדי להשתמש בה. יש לפקודה שני ארגומנטים תקפים:
1 .cmd - ארגומנט זה משמש להריץ פקודה באמצעות /bin/sh. כל המשתנים הנתונים להלן מוגדרים וניתן להשתמש בהם בפקודה. אם משתמשים במשתני סביבה כחלק מארגומנט, יש לשים לפניהם סימן "$". הסיבה לכך היא שהשרת יוצר תהליך מעטפת
(shell) כדי להריץ את הפקודה, וכך ניגשים למשתני הסביבה אם מתכנתים ב - shell.
2 .cgi - ארגומנט זה משמש להריץ CGI script ולהוסיף את הפלט שלו. השרת מחפש את הקובץ אשר שמו מפורט בנתיב הוירטואלי לספריית CGI נתונה (cgi-bin). אם התוצאה של ה - script היא תג מיקום, השרת ייצור קישור אליו. אחרת, תוצאת ה - script תשובץ אל תוך קובץ ה - HTML. השרת לא מבצע בדיקת שגיאות לוודא שה- script פלט טקסט בלבד, אך השרת כן יפרש כל URL LOCATION: header ויהפוך אותו לעוגן HTML.
לכן, חשוב לציין שתוכנית CGI אשר הופעלה ע"י פקודת SSI חייבת להפיק פלט טקסט בלבד כי נתונים אלה משובצים בתוך מסמך HTML או מסמך רגיל שהפעיל את הפקודה.
כתוצאה מכך, לא משנה אם נפיק פלט מסוג text/plain או text/html, כיוון שהדפדפן
יפרש את הנתונים בתוך הטווח של המסמך הקורא.
דוגמאות:
בדוגמא הבאה, נשתמש בפקודת UNIX finger כדי לאחזר מידע אודות המשתמש:
|
<!--#exec cmd="/path_to/finger $REMOTE_USER@$REMOTE_HOST"-->
|
|
יש לתחום את הפלט מפקודה חיצונית בתוך גוש של <PRE> . . . </PRE> כדי לשמור על רווחים לבנים, ואז, אם קיים קוד HTML בתוך פלט הנתונים של התוכנית החיצונית, הדפדפן יפרש אותו.
הדוגמא הבאה מראה מונה הסופר כניסות משתמשים בעזרת שימוש בפקודת cmd exec. יש ליצור קובץ בשם counter.txt ולבצע את הפעולות הבאות:
|
$echo "0" > path_to/counter.txt
$chmod 777 path_to/counter.txt
|
|
הוסף ל- HTML שלך:
|
<!--#exec cmd="path_to/perl -pi -e
'$_++' path_to/counter.txt;cat path_to/counter.txt"-->
|
|
יש להגדיר את הקונפיגורציה של פקודת ה- path_to - Perl וקובץ המונה בדוגמא לעיל, ע"מ שיתאים למערכת.
יש לכך שתי הגבלות:
1. קובץ נתוני המונה (counter.txt) חייב להתקיים יחד עם הרשאות קריאה וכתיבה מתאימות.
2. אין זה נועל את קובץ counter.txt, מה שחיוני כדי לטפל בגישות בו זמניות לעמוד.
פקודה זו מכניסה גודל של קובץ מצוין (יחסית ל שורש המסמך בשרת) בבתים. הארגומנטים (התקפים) זהים לארגומנטים בפקודת include.
ניתן לפרמט את גודל הקובץ באמצעות הפרמטר sizefmt בפקודת config.
דוגמאות:
|
<!--#fsize file="foo.txt"-->>
<!--#fsize virtual="/path_to/foo.txt"-->>
<!--#config sizefmt="bytes"-->
|
|
פקודה זו מכניסה את תאריך וזמן העדכון האחרון של קובץ. ארגומנטים תקפים זהים לארגומנטים של פקודת include.
ניתן לפרמט את הזמן בעזרת הפרמטר timefmt בפקודת config.
ההבדל בין משתנה הסביבה ב- SSI בשם LAST_MODIFIED לבין פקודה זו הוא ש - flastmod מאפשרת לבחור כל קובץ שהוא ואילו LAST_MODIFIED מציג מידע המתייחס לקובץ הנוכחי.
דוגמא:
|
<!--#flastmod file="foo.txt"-->
<!--#flastmod virtual="/path_to/foo.txt"-->
|
|
דרושים שלושה מאפיינים כדי שעיבוד באמצעות SSI יעבוד:
1. אילו ספריות מאפשרות שימוש ב - SSI.
2. האם מותר לבצע exec מספריות אלה.
3. איזו סיומת קבצים אומרת לשרת לבצע חלוקה וניתוח לקובץ.
עתה נדון באלה בהרחבה, תוך התייחסות לשרת המבוסס על UNIX כגון אפאצ'י
(או NCSA). לאחר מכן נדון בקצרה ב - SSI בשרתים המבוססים על חלונות או מקינטוש.
9.2.5.1 ספריות: האם להוסיף include או לא?
קודם כל, כדי ש - SSI יפעלו, יש לדאוג שהשרת יוכל לקבל תוספות אלו. ראשית יש להחליט באילו ספריות ניתן יהיה לאפשר את התוספות. ניתן לקבוע שהאתר כולו יקבל תוספות או רק ספריות מסוימות. כמו כן ניתן לעצב את האתר כך שיאפשר תוספות אך לא יאפשר שימוש
ב - exec. לבסוף, ניתן להפעיל את התוספות ביחס לכל הקבצים או רק קבצים בעלי סיומת מיוחדת (בדר"כ shtml). בגלל בעיות בטיחות אפשריות, יש לנקוט משנה זהירות בקבלת החלטות אלו. עדיף לא לכלול שימוש ב - exec בספריות שאינן בטוחות מספיק.
כעת, יש להורות לשרת מהי סיומת שם הקובץ בה משתמשים לקבצים המחולקים והמנותחים. קבצים אלה אומנם דומים ל - HTML, אך ההתייחסות אליהם שונה. בתוך השרת, השרת משתמש בסוג MIME : text/x-server-parsed-html כדי לזהות מסמכים מנותחים, ואז מבצע המרות כדי להפוך קבצים אלה ל - HTML עבור הלקוח.
זה נעשה על פי המידע בקבצי הקונפיגורציה של השרת. בשרת אפאצ'י, קובץ זה הוא srm.conf. קבצי קונפיגורציה דומים מצויים בשרתים אחרים. כדי להורות לשרת מהי הסיומת בה מעונינים להשתמש לקבצים מנותחים, יש להשתמש בפקודת AddType.
למשל, השורה הבאה תחייב את השרת לבצע חלוקה וניתוח על כל הקבצים המסתיימים
ב- shtml. :
|
AddType text/x-server-parsed-html .shtml
|
|
נקודה שחשוב לציין כאן היא שלא ניתן לכלול פקודות SSI בתוך תוכנית ה- CGI כי השרת אינו מחלק ומנתח פלט של תוכנית.
יש לקבוע שתי אופציות לקונפיגורציה בקובץ הגדרת הגישה (access.conf), והן מכתיבות אילו פקודות SSI יכולות להיכנס לתוך קובץ ה - HTML:
1. על מנת לשבץ פקודות SSI אשר יציגו את משתני הסביבה ונתונים אודות הקבצים בתוך
מסמכי ה - HTML , יש להפעיל מאפיין המכונה includes.
2. כדי לאפשר הרצת תוכניות חיצוניות מתוך מסמכי ה - HTML, יש להפעיל את מאפיין
ה - exec.
כדי להפעיל את שתי התכונות הנ"ל ניתן לכתוב:
|
|
גם כאן, לפני הפעלת התכונות הללו, יש לשקול היטב את נושא הבטיחות והביצועים.
כדי לקבוע את הקונפיגורציה של SSI לכל ספרייה בנפרד, יש להכניס את אותה פקודה בקובץ htaccess. בספריה בה רוצים לאפשר SSI.
כיום אפאצ'י מעוצב כך שכל הקבצים בעלי סיומת shtml., אפילו קבצים עם SSI, יעברו חלוקה וניתוח ע"י השרת וייבדקו פקודות SSI. אם רוצים להוסיף גושי קוד HTML אשר יכללו בתוכם פקודות SSI אחרות - יש לתת לקבצים אלה סיומת shtml.
9.2.5.5 SSI בשרתים המבוססים על חלונות או מקינטוש
הרבה שרתי אינטרנט מבוססי חלונות תומכים ב- SSI. למשל: Microsoft IIS ושרת
ה - Netscape's FastTrack ל - Windows NT 4.0. אך, לא כולם תומכים בפקודת exec והם פועלים באופן השונה מאופן פעולתו של שרת המבוסס על UNIX. בשרת IIS של Microsoft, שמות הקבצים לחלוקה וניתוח ע"י השרת חייבים לשאת סיומת של stm. רק כאשר מריצים את ה - script ב- DOS ניתן לקשר סיומת pl. של Perl script ל - perl.exe. יתרה מזו, כדי להריץ את perl.exe בדפדפן ברשת, צריך להגדיר את הקשר ביניהם
ב - Nt registry.
WebSTAR הוא שרת אינטרנט פופולארי המבוסס על מקינטוש והוא תומך ב- SSI באמצעות "server plug-ins".
לתוספות אלה מגוון יישומים. הם מאפשרות למשתמשים ליצור מסמכים שמספקים מידע הנוצר באופן דינמי. מידע כזה עשוי להיות התאריך הנוכחי, תאריך העדכון האחרון של הקובץ והגודל או תאריך עדכון אחרון של קבצים אחרים. בשימושים מתקדמים יותר, מהוות התוספות ממשק רב עוצמה ל - CGI scripts ותוכניות bin/sh/ , ואלה יכולים לספק מוני גישה פשוטים או כותרות מתחלפות.
9.2.6.1 תבניות מסמך ו - Boilerplates
מבקרים באתר בד"כ מחפשים את התוכן המעודכן ביותר. אם הם רואים עמוד מיושן שאינו מעודכן, הם עלולים להתעלם ממנו, או אם נתקלים בעמוד ללא תאריך, הם עלולים לחשוב שהוא מיושן. לכן כדאי להוסיף למסמכים תאריך עדכון אחרון.
יישום שימושי של SSI הוא הכנסה אוטומטית של תאריך העדכון האחרון של המסמך שנתבקש.
זה נעשה ע"י הכנסת |
<!--#echo var="LAST_MODIFIED"-->
|
|
לתוך המסמך, כדי שתאריך העדכון האחרון יופיע.
פקודה זו מחקה פורמט של שדה כותרת עליונה של HTTP. כאשר מסתכלים על המידע הנוגע לעדכון האחרון, פירוט השניות בזמן אינו כ"כ משמעותי. ניתן לשנות את הפורמט הזה ע"י הוספת: |
<!--#config timefmt="time-format"-->
|
|
לפני הכנסת תאריך העדכון האחרון.
time-format היא מחרוזת שמתאימה לפונקציה הקוראת לספרייה (3)Strftime ברוב הגרסאות של UNIX. מחרוזת זו כוללת פקודות המתחילות בסימן % וכן תווים אחרים. למשל: |
<!--#config timefmt="%A, %B %d, %Y"-->
|
|
דוגמא זו תוצג בצורה הבאה: Friday, May 9, 1999.
בדוגמא זו, במקום A% יופיע היום בשבוע, במקום B% יופיע שם החודש; d% הוא היום בחודש, Y% יוחלף בשנה. במערכות הפעלה אחרות צורות אלו יכולות להופיע קצת אחרת.
כמו כן, ניתן להכניס את תאריך העדכון האחרון של מסמכים אחרים. למשל בדוגמא הבאה:
|
<!--#flastmod virtual="/path_to/foo.html"-->
|
|
אפשרות זו תהיה שימושית במקרה של אינדקס או תוכן עניינים אשר מציג את רשימת המסמכים הזמינים וגם את תאריך העדכון האחרון שלהם:
|
<HTML>
<HEAD>
<TITLE>Table of Contents</TITLE>
</HEAD>
<H1>Table of Contents</H1>
We have the following information for you:
<UL>
<LI>Document 1 (Last Modified : <PRE><!--#flastmod virtual="/path_to/1.html"--></PRE>)
<LI>Document 2 (Last Modified : <PRE><!--#flastmod virtual="/path_to/2.html"--></PRE>)
.
.
.
</UL>
.
.
.
<PRE>
<!--#echo var="LAST_MODIFIED"-->
</PRE>
</BODY>
</HTML>
|
|
יישום נוסף של SSI הוא להעניק זהות ועקביות לאתר. את זאת אפשר לעשות ע"י יצירת תבניות למסמכים והכללת מידע החוזר על עצמו במסמכים באופן דינמי.
דוגמאות:
מידע על כותרת עליונה - הכותרת העליונה יכולה להכיל תג <BODY> כדי לשמור על עקביות הצבעים ברקע, הצבעים לטקסט והצבעים לקישורים. כמו כן, ניתן להוסיף כפתורי ניווט בחלקו העליון (או התחתון) של כל עמוד באתר. אופציה נוספת היא לכלול CSS
( גליונות סגנון מדורגים).
מידע על הכותרת התחתונה - ניתן להוסיף מידע כגון זכויות יוצרים, תאריך עדכון אחרון, שם הכותב וכתובת ה - e-mail שלו, קישור לעמוד הבית של האתר וכו' - בתחתיתו של כל עמוד ועמוד.
למען היעילות, עדיף לשמור את כל המידע החוזר בתוך קובץ. אפשר לתת לקבצים שיתווספו סיומת שונה מ- html (למשל incl) , כיוון שקבצים אלה כוללים סימונים של HTML אבל הם לא עמודים מלאים בזכות עצמם.
ע"י שימוש בסיומות שונות כמפתח לתוכן הקבצים, יהיה קל יותר לעקוב אחריהם.
ועתה, באמצעות פקודת ה- include של SSI, עם הפרמטר virtual (אשר יאפשר לנו להכניס את הקבצים עם המידע שברצוננו להוסיף בכל מקום שהוא באתר), נוכל ליצור את התבנית (המינימלית) הרצויה:
|
<HTML>
<HEAD>
<TITLE>Template</TITLE>
</HEAD>
<PRE>
<!--#include virtual="header.incl"-->
</PRE>
<H1>Template</H1>
.
.
.
<PRE>
<!--#include virtual="footer.incl"-->
</PRE>
</BODY>
</HTML>
|
|
9.2.6.2 מונה לספירת כניסות משתמשים
תוספות שרת מאוד שימושיות במקרה שרוצים להוסיף מידע "דמוי-CGI" וכן פלט מתוכניות CGI אל תוך מסמכים ברשת. באמצעות תוספות שרת עם פקודת cgi exec, ניתן לשבץ את התוצאות של CGI script שלם אל תוך מסמך HTML סטטי. נדגים זאת באמצעות דוגמא של מונה לספירת כניסות משתמשים.
בדוגמא הבאה נתבונן ב - CGI script פשוט (counter.cgi) בשרת אשר עוקב אחרי מספר הכניסות של מבקרים לאתר.
|
#!/path_to/perl -w
print "Content-type: text/plain", "\n\n";
$counter_file = "path_to/counter.txt";
open(FILE, ">>$counter_file");
close(FILE);
chmod(0777,"counter.txt");
open (FILE, "<" . $counter_file) || die "Can not read from the counter file.\n";
flock (FILE, 2);
$number_accesses = <FILE>;
flock (FILE, 8);
close (FILE);
open (FILE, ">" . $counter_file) || die "Can not write to the counter file.\n";
flock (FILE, 2);
$number_accesses++;
print FILE $number_accesses;
flock (FILE, 8);
close (FILE);
print $number_accesses;
exit (0);
|
|
כמו כן ישנו גם ישנו קובץ counter.txt המאותחל ל - 0. יש להגדיר תחילה את הקונפיגורציה של ה - path_to של ה - Perl וקובץ המונה המתואר לעיל במערכת. לאחר מכן אפשר לקרוא למונה ה - scriptבאמצעות פקודת execcgi במסמך HTML בשם: foo.shtml
בצורה הבאה:
|
This page has been accessed <!--#exec cgi="/cgi-bin/counter.cgi"--> times.
|
|
התהליך שמתרחש הוא כדלקמן: כל פעם שמשתמש נכנס למסמך foo.shtml, פקודת
ה - SSI בו קוראת ל - script counter.cgi, אשר קורא את הערך המספרי המאוחסן בקובץ נתוני המונה counter.txt, מגדיל אותו ב - 1 , כותב את הערך החדש חזרה לקובץ ומציג אותו כפלט.
יש לציין שהמונה בדוגמא לעיל הוא לצורך הדגמה בלבד. כיוון שהוא אינו מנצל טכניקות מכוונות-עצמים של Perl, ניתן להעבירו על פני גרסאות שונות של Perl אבל הוא עלול לסבול מחסרונות, לדוגמא חולשה בניידות על פני פלטפורמות, וזאת בגלל השימוש בפונקציית flock. למשל הוא אינו נתמך בגרסה האחרונה לחלונות 95
(Perl עבור Win32 Build 316). קיימים פתרונות חלופיים אפשריים:
1. אם משתמשים באפאצ'י אפשר לנצל מודולי מונה קיימים (ניתן לבדוק
ב - module registry) או להוסיף מודול שמתאים לצרכים הנדרשים. פתרון זה הוא
בדר"כ יעיל יותר משימוש בתוספות שרת.
2. קיימים שירותים ציבוריים רבים, חלקם בחינם (לשימוש לא מסחרי ומוגבל במספר
הכניסות ביום - כגון NedStat) אשר עשויים להעניק חלוקה וניתוח מקיף לעמודים
הרשומים אצלם.
3. אין טעם לשים מונה בכל עמוד. כדי לקבל תוצאות מקיפות יותר ובעלות משמעות,
ניתן להשתמש באחת מהתוכניות הסטטיסטיות הרבות (כגון Analog, בעל יציאות
ל - UNIX, מקינטוש וחלונות) כדי לנתח קבצי log של השרת, אם קיימת ההרשאה
הדרושה לכך.
9.2.7 ניפוי שגיאות (Debugging) ב-SSI
כאשר משתמשים בתוספות שרת, יש לזכור מספר דברים.
קודם כל, לא לשכוח את סימן ה - # ולא להשאיר רווחים בין סימן ה - "-" לבין ה - "#".
|
<!--echo var="REMOTE_USER"-->
<!-- #echo var="REMOTE_USER"-->
|
|
אם מבצעים אחת משתי שגיאות אלו, השרת לא יודיע על שגיאה אלא יתייחס לכל הביטוי כהערת HTML.
הערות תחביר שיש להתייחס אליהן:
* לא להשאיר רווחים בין סימן ה - "=" לבין הקובץ שהוא מציין. ביצוע שגיאה מסוג זה
יגרור הודעת שגיאה.
* לא לשכוח להשתמש במרכאות כפולות מסביב לארגומנטים.
* כל שמות הפרמטרים והפקודות חייבים להיות באותיות קטנות.
* בערכי הארגומנטים מותר להשתמש באותיות גדולות וקטנות אך יש לזכור ש - UNIX
רגיש להבדל בין אותיות גדולות וקטנות והוא מחשיב אותם כשתי ישויות שונות.
* כל קובץ שמוסיפים (included) כפוף לבקרת הרשאות הגישה הרגילות.
* אם משתמשים בשם domain, יש להשתמש בפרמטר virtual.
* תהליך עיבוד ה- SSI מתבצע כך: נניח שאפשרו לשרת לקבל תוספות שרת בכל קובץ
אשר שמו מסתיים ב - shtml. בכל פעם שהשרת רואה בקשת GET מלקוח, הוא
בודק האם הקובץ המבוקש מסתיים ב - shtml. אם כן, השרת בודק אם בקובץ
נמצאים תוספות (SSI), בגלל הסיומת. כשהשרת מאתר פקודות, הוא מעבד אותם
ומחזיר את המסמך השלם, כשסוג התוכן מוגדר כ- text/html. אם קבצי
הקונפיגורציה אינם מוגדרים נכון, תהליך זה ייכשל.
9.3 הרחבה לתוספות שרת (eXtended Server-Side Includes - XSSI)
XSSI הם חלק משרת האפאצ'י (גרסה 1.2 ומעלה), והם הרחבה של תוספות השרת של NCSA. אפאצ'י מכיל מודול של mod_include ,XSSI, אשר מגדיר קבוצת פקודות למטרה זו.
בנוסף ליתרונות (שהזכרנו לעיל) של תוספות שרת, יש כמה יתרונות ספציפיים ל - XSSI וביניהם:
* ישנן אפליקציות שאפשר לבצע כיום בעזרת XSSI אשר עד עכשיו היו אפשריים רק
בעזרת שפות כגון JavaScript. אך להבדיל מ - Java Script (שאפשר "לכבות"
אותה), XSSI אינו תלוי ביכולות של הדפדפן.
* להבדיל מ - CGI scripts, XSSI הם מאוד "זולים" לשרת. פקודות אלה מגבירות את
הביצועים כי הם מאפשרות להוסיף מודולים של מידע בשרת, אשר מצמצמים את
מספר החיבורים הדרושים כדי ליצור עמוד. פירוש הדבר הוא שאם מריצים אלמנטים
בעמוד בעזרת תוספת, הלקוח מקבל את המידע בבקשה אחת ולא במספר בקשות
(מה שהיה קורה בשימוש בקריאת CGI).
חבילת XSSI של WebMonkey מרחיבה את עורך ה- HTML Macromedia Dreamweaver 2.0, כך שניתן להשתמש ב - XSSI בתוך העורך.
הקבצים מהווים ממשק גרפי להכנסת פקודות XSSI ולעריכת שינויים בהם. בנוסף, ניתן להגדיר משתני סביבה המאפשרים לראות כיצד ייראה העמוד בתנאים שונים (למשל, בדפדפנים שונים). לאחר התקנת החבילה, ניתן להוסיף פקודות XSSI, מתוך קטגוריית XSSI בפלטת הצבעים של האובייקטים הצפים של Dreamweaver.
9.3.2.1 המודול mod_include באפאצ'י
מודול זה נמצא בקובץ mod_include.c ומקומפל בברירת מחדל. ניתן להיעזר ברכיבי בקרת זרימה של XSSI כדי להגדיר פקודות המבוססות על משתני הסביבה של המשתמש. כמה פקודות, מעבר להגדרות המקוריות של NCSA, הוצגו באפאצ'י 1.2, במיוחד פקודות חדשות לבקרת הזרימה. בחלק זה נדון רק במושגי XSSI אשר מהווים שינוי או תוספת
ל - SSI. מושגים אשר קיימים גם ב - XSSI וגם ב - SSI יזכו רק לאזכור.
9.3.3 משתני סביבה של XSSI
משתני הסביבה של XSSI הם כמו משתני הסביבה של SSI.
לפקודות אלו יש הפורמט הבא: |
<!--#command parameter=argument ... -->
|
|
הארגומנט לרוב תחום במרכאות כפולות. פקודות רבות אינן מאפשרות יותר מזוג אחד של פרמטר-ארגומנט. כמו כן, יש רווח לבן לפני סימן סיום ההערה (<--).
תוספות XSSI כוללות את כל הפקודות של SSI, השינויים/התוספות הם כדלקמן:
פקודה זו בעלת הפרמטר virtual הורחבה ועתה כוללת גם exec. לכן אפשר להשתמש
ב - |
<!--#include virtual="/cgi-bin/bar/foo.cgi"-->
|
|
ניתן אפילו להוסיף מחרוזת שאילתא ל - CGI script בצורה הבאה:
|
<!--#include virtual="/cgi-bin/bar/foo.cgi?query_string"-->
|
|
מומלץ להשתמש באלמנט ה - include virtual במקום exec cgi.
פקודה זו מדפיסה רשימה של כל משתני הסביבה הקיימים וערכיהם. פקודה זו מתבצעת ללא פרמטרים. לדוגמא: |
|
הפלט ייראה כך: |
HTTP_USER_AGENT = Mozilla/4.0 [en] (Win95; I)
|
|
החלק הראשון (באותיות הגדולות) הוא שם המשתנה. החלק השני (אחרי הסימן ה - "=") הוא ערכו.
פקודה זו קובעת את ערכו של משתנה.
הפרמטרים הם var, שם המשתנה שיש לקבוע את ערכו, ו - value, הערך של המשתנה.
|
<!--#set var="some_variable" value="its_value" -->
|
|
לדוגמא, נניח כי קיים מסמך בשם foo.shtml שיש לו:
|
<!--#set var="size" value="$QUERY_STRING" -->
<FONT face="Verdana" size="<!--#echo var="size"
-->"><!--#echo var="QUERY_STRING" -->Text</FONT>
|
|
(יש לשים לב ש - QUERY_STRING הוא משתנה סביבה של CGI אשר זמין ל - XSSI).
אם ניגש ל - foo.shtml בצורה: |
http://some_domain/path_to/foo.shtml?+n
|
|
כאשר 1,2,3=n והלאה, ניתן יהיה לראות שגודל "Text" משתנה (אם הדפדפן תומך
בתג <font>). באופן דומה ניתן לשנות את מאפייניו האחרים של "Text" , למשל את הפונט face.
9.3.4.4 פקודות if, elif, else, endif
פקודות בקרת הזרימה מאפשרות למסמכים להציג בצורה שונה, תלוי במשתנה.
|
<!--#if expr="test_condition" -->
<!--#elif expr="test_condition" -->
<!--#else -->
<!--#endif -->
|
|
פקודת if פועלת כהוראת if בשפת תכנות. בודקים את תנאי המבחן (test condition) ואם הוא נכון (true), אזי הטקסט המופיע עד לפקודת elif, else או endif ייכלל בתזרים הפלט. אם תנאי המבחן המקורי אינו נכון (false), פקודות ה - elif או else מכניסות את הטקסט לפלט. פקודות אלה הן אופציונליות. פקודת endif מסיימת את פקודת ה- if.
אפאצ'י מעריך את תנאי המבחן ואם הוא נכון, מתבצע הקוד המופיע אחריו (אם יש הוראות XSSI אחריו) או מודפס (אם text/html מופיע אחריו). כל אפשרויות תנאי המבחן מופיעות
בטבלה הבאה:
|
תנאי המבחן | ערך אמת | תיאור |
string | true | אם המחרוזת לא ריקה |
string1 = string2 string1 != string2 string1 < string2 string1 > string2 string1 <= string2 string1 >= string2 | true | השוואת string1 עם string2 אם string2 היא מהצורה /string אז היא מושווה כביטוי רגיל (שיש לו אותו תחביר כמו התחביר בפקודת egrep ב - UNIX |
test_condition | true | אם תנאי המבחן (test_condition) נכון (true) |
!test_condition | true | אם תנאי המבחן (test_condition) לא נכון (false) |
test_condition1 test_condition2 && | true | אם תנאי מבחן 1 (test_condition1) וגם תנאי מבחן 2 (test_condition2) נכונים (true) |
test_condition1 test_condition2 || | true | אם תנאי מבחן 1 (test_condition1) או תנאי מבחן 2 (test_condition2) נכונים (true) |
|
"=" ו- "=!" קודמים ל - "&&" ו- "||".
ל - "!" יש את הקדימות הגבוהה ביותר.
מאוחר יותר נראה יישום שימושי של פקודות לבקרת זרימה בעזרת כמה מתנאי המבחן המופיעים בטבלה זו.
ב- XSSI, ניגשים אל המשתנה בשמו או עם סמן $ לפניו (בהקשרים בהם לא ברור אם הוא משתנה או לא). החלפת משתנים תתבצע בתוך מחרוזות התחומות במרכאות, ברוב המקרים בהם הן עשויות להופיע כארגומנט לפרמטר של פקודת XSSI. אלה כוללים את הפקודות: echo, config, exec, flastmod, fsize, include, set ופקודות לבקרת זרימה.
ניתן להגדיר משתנים בשתי צורות שונות: ניתן להגדיר משתנים לבד בעזרת פקודת set, או ניתן להשתמש באחד המשתנים המוגדרים אוטומטית לכל דפדפן כשהוא מבקש עמוד (כדי לראות רשימת משתנים כאלה לדפדפן מסוים, יש להשתמש בפקודה <--printenv #--!>).
אפשר להוסיף סמן $ אל תוך המחרוזת כשלפניו יבוא / . למשל:
|
<!--#if expr="$x = \$test" -->
|
|
דוגמא:
דוגמא זו מדגימה החלפת משתנים בפקודות לבקרת זרימה.
יודפס "in A" אם ה - DOCUMENT_URI הוא foo/file.html/.
יודפס "in B", אם ה - DOCUMENT_URI הוא bar/file.html/ .
אחרת, ידפיס "B או A in neither".
|
<!--#if expr="\"$DOCUMENT_URI\" = \"/foo/file.html\"" -->
in A
<!--#elif expr="\"$DOCUMENT_URI\" = \"/bar/file.html\"" -->
in B
<!--#else -->
in neither A or B
<!--#endif -->
|
|
אם נותנים למסמכים המכילים פקודות XSSI את הסיומת shtml., הפקודות הבאות יגרמו לאפאצ'י לבצע בהם חלוקה וניתוח ולייחס למסמך שנוצר סוג MIME של text/html :
|
AddType text/html .shtml
AddHandler server-parsed .shtml
|
|
כשיש ספריות הכוללות קבצי shtml. (בדר"כ בקטע ), יש לתת את הפקודה הבאה (פקודה זו תקפה גם בקבצי htaccess. אם נקבעה AllowOverride Options):
|
|
ישנם מקרים בהם רוצים להשתמש ב - XSSI אבל לא להחליף את שמות העמודים
מ - html.* ל - shtml.*. פקודת XBitHack באפאצ'י מבצעת זאת. הפקודה משפיעה רק על קבצים הקשורים לסוג MIME text/html. כל שצריך לעשות כדי שהשרת יחלק וינתח את העמוד הוא להפעיל את ביט ה - user-execute. כדי לעשות זאת, יש להוסיף את השורה הבאה לקובץ ה - htaccess. - |
|
כל קובץ אשר מופעל בו ביט זה, יזכה לטפול כמו מסמך html המנותח ע"י השרת. כך, אם נקבע את הרשאות הקובץ המתאימות (באמצעות chmod 744 ב - UNIX) השרת יחלק את העמוד. (משיקולי אבטחה, אין לתת הרשאות אלה לקבצים אחרים אשר לא יחולקו). בעיה פוטנציאלית בשיטה זו היא העובדה שקובץ זה באמת יהפוך להיות מוכן להרצה. אם בטעות מריצים אותו משורת הפקודות, עם כל תווי ">" ו - "<", עלולים להרוס את האתר כולו.
XSSI מרחיבים את מגוון האפליקציות האפשריות בעזרת SSI. חלקן, כמו למשל להציג דפים ספציפיים שונים למבקרים באתר המגיעים ממקומות שונים, (בהתבסס על סוג הדפדפן או על התאריך והשעה ביום) התאפשרו קודם רק בעזרת שפות כגון JavaScript. להלן דוגמא של אפליקציה כזו.
9.3.6.1 שירות המציג עמודים שונים למבקרים ממקומות שונים
בעזרת פקודות בקרת הזרימה של XSSI, ניתן להציג עמודים שונים, לפי ה - domain של המשתמש. למשל, אם רוצים להציג עמודים ספציפיים כשמבקרים באים משלושה מקומות שונים, ועמוד זהה לכל המבקרים שבאים מכל מקור אחר:
עמוד הכולל פרטי השכלה יוצג למבקר מבריטניה;
עמוד הכולל פרטי השכלה ונסיון מקצועי יוצג לנציג ממשלת קנדה;
עמוד הכולל נסיון מקצועי לנציג מאוניברסיטה באוסטרליה;
עמוד כללי משותף לכל המבקרים האחרים.
קודם כל צריך לפתח שלושה מסמכים שונים, למשל edu.incl, prof.incl, gen.incl, בהם יכללו מידע כללי, פרטי השכלה ונסיון מקצועי, בהתאמה. יש לשמור אותם באותה ספריה יחד עם עמוד ה - index.shtml אשר יכלול את כל התוספות. בעמוד ה - shtml.index , יש ליצור את הכותרת (title), ומרכיבי התצוגה (צבעים, פורמט). כשמישהו מבקש לגשת לעמוד זה, השרת יבצע חלוקה וניתוח, ואז העמוד המותאם אישית לאותו מבקר יוצג לו מבלי שידע על כך.
בעזרת XSSI, ניתן להתאים אישית את ה - index.shtml, על פי ה - domain של המבקר: סיומת של uk. למבקר מבריטניה; gc.ac למבקר מממשלת קנדה; edu.ac למבקר מאוניברסיטה באוסטרליה. ניתן להיעזר במשתנה REMOTE_HOST כדי לבדוק את שם
ה - domain. כעת, ניתן לכלול את השורות הבאות ב - index.shtml :
|
<!--#if expr="\"$REMOTE_HOST\" = /.*uk/" -->
<p><!--#include virtual="edu.incl" -->
<!--#elif expr="\"$REMOTE_HOST\" = /.*gc.ca/" -->
<p><!--#include virtual="edu.incl" -->
<p><!--#include virtual="prof.incl" -->
<!--#elif expr="\"$REMOTE_HOST\" = /.*edu.au/" -->
<p><!--#include virtual="prof.incl" -->
<!--#else -->
<p><!--#include virtual="gen.incl" -->
<!--#endif -->
|
|
אין צורך לכתוב את השורות המורחקות מהשוליים - כאן מופיעות שורות אלו רק כדי להקל על הקריאה. ניתן לשנות את הדוגמא לעיל בקלות ולהתאימה לצרכי המשתמש. למשל, אם רוצים להציג את המסמכים רק בינואר עבור מבקרים מבריטניה; בכל החודשים מלבד יולי עבור מבקרים מממשלת קנדה; ללא כל הגבלת זמן למבקרים מאוניברסיטה באוסטרליה או למשתמש בשם Einstein, וללא כל הגבלת זמן בכל מקום אחר, ניתן לבצע את הדוגמא הבאה:
|
<!--#config timefmt="%B" -->
<!--#if expr="$DATE_GMT = /January$/ && \"$REMOTE_HOST\" = /.*uk/" -->
<p><!--#include virtual="edu.incl" -->
<!--#elif expr="$DATE_GMT != /July$/ && \"$REMOTE_HOST\" = /.*gc.ca/" -->
<p><!--#include virtual="edu.incl" -->
<p><!--#include virtual="prof.incl" -->
<!--#elif expr="\"$REMOTE_HOST\" = /.*edu.au/ || \"$REMOTE_USER\" = /einstein/" -->
<p><!--#include virtual="prof.incl" -->
<!--#else -->
<p><!--#include virtual="gen.incl" -->
<!--#endif -->
|
|
9.3.7 ניפוי שגיאות ( Debugging ) ב-XSSI
מעבר לנושאים שהוזכרו בקשר ל - SSI, יש להתחשב בשיקולים נוספים:
* הסימן המסיים הערות (<--) בפקודת XSSI בא אחרי רווח לבן.
* אם מוסיפים את הטקסט הבא:
|
<PRE>
<!--#printenv -->
</PRE>
|
|
למסמך, הוא ידפיס את משתני הסביבה וערכיהם, בהתאמה. כך ניתן לראות את רשימת המשתנים המלאה כדי שיהיה ניתן לבדוק האם XSSI נקבע עבור משתנה שאינו תקף.
נניח וקיימים קבצי HTML בהם נרצה להשתמש ב - SSI.
במקרה כזה, הפיכת קבצי html.* אלו לקבצי shtml.* הופכת להיות מטלה אדירה.
בעזרת Perl script, אפשר לעשות זאת בקלות, בצורה הבאה:
יש להעתיק (תוך שמירה על זכויות היוצרים) את ה - script הבא לקובץ, ולכנות אותו rename ואז יש לשנות את הנתיב ל - usr/bin/perl )Perl/!#):
|
#!/usr/bin/perl -w
# rename - Larry's filename fixer
$op = shift or die "Usage: rename expr [files]\n";
chomp(@ARGV = <STDIN>) unless @ARGV;
for (@ARGV) {
$was = $_;
eval $op;
die $@ if $@;
rename($was,$_) unless $was eq $_;
}
|
|
ב - prompt של ה- shell (בפלטפורמות של UNIX, בפלטפורמות אחרות, יש להשתמש בגרסה של find), יש להקליד את הטקסט הבא, כששם הספריה (directory_name)
מציין את הספריה ברמה הגבוהה ביותר (עם ספריות משנה במקום שבו מצויים
קבצי html.*):
|
find ./directory_name -name '*html' -print | rename 's/html/shtml/'
|
|
XSSI יכולים להיות מאד שימושיים אך בעלי חסרונות רבים:
1. ביצועים - באופן כללי, ביצוע חלוקה וניתוח שוטפת של הקבצים לפני שליחתם ללקוח
מהווה מעמסה על השרת. בדומה ל - SSI, ניתן לקבוע את הקונפיגורציה כך שהשרת
יחלק וינתח את כל מסמכי ה - HTML (בין אם יש בהם או אין בהם פקודות SSI). אך
פעולות אלה פוגעות מאוד בביצועי השרת כיוון שהוא צריך לחלק את כל מסמכי
ה - HTML . כמו כן, השימוש בפקודת exec עלול להיות לא יעיל, לפעמים.
2. אבטחה - השימוש בפקודות exec יוצר סיכון בטחוני פוטנציאלי. הסיכון הוא מתן
אישור למשתמשים בעלי יכולת ממוצעת לשמש כשרת. משתמשים טירונים עלולים
לשבץ פקודות להרצת פקודות מערכת שמציגות מידע חסוי. ניתן להשתמש
בפקודה זו גם כדי לתקוף אבטחה של אתר.
לדוגמא, נניח שקיים scriptשל יומן מבקרים, המאפשר למבקרים להכניס קוד HTML כחלק מההערות שלהם. נניח כי ה-script מאפשר SSI בשרת. אם ה - script לא יסנן את
פקודות ה - SSI מהקלט, אזי הקלדת: |
<--#exec cmd="/bin/rm -fr /"-->
|
|
ב - form field (אזור במסמך HTML הכולל אפשרויות לקליטת קלט מהמשתמש)
עלולה להוות בעיה חמורה. בדומה לכך, הקצאה רשלנית של הרשאות קובץ, בעת
שימוש בפקודת XBitHack, עלולה להוביל לבעיות שונות.
יש לקחת פרטים אלה בחשבון לפני הרצת XSSI על השרת. למרות חסרונות אלה,
X)SSI) עשוי להיות כלי רב עוצמה אם משתמשים בו בזהירות.
בעתיד הקרוב כולנו נכתוב כך.
X)SSI) מהווים חלופה שימושית ל - CGI ובמקרים מסוימים גם ל - JavaScript, בביצוע מטלות שגרתיות. יש בהם יתרונות שונים, אם משתמשים בהם בזהירות ובתבונה, במיוחד לניהול אתרים בקנה מידה גדול.
|
|