xhtml apache מפת האתר דף ראשי

«
«
«
«
«
«
«
«
«
«
«
«
«
«

«

XSSI הרחבות  « SSI  « ראשי

מאמר 14: הרחבות XSSI / ט.מונקי

14.1 הקדמה

ה- XSSI של אפצ'י ( תוספות מורחבות לצד השרת - extended server-side inclusions) הוא כלי שימושי מאד למפתחי אינטרנט כי הוא מציע דרך פשוטה ויעילה לבצע scripting בסיסי בעמודי אינטרנט.
למשל, Webmonkey (אתר באינטרנט) מסתמך בצורה רבה על XSSI לשלוט בהיבטים רבים בעמודי האתר.

אך אם היית רוצה ליצור מחדש את עמודי האתר של Webmonkey - לא תצליח. הרבה ממה שנעשה בעמודים אלה פשוט אינו אפשרי באמצעות הגרסה הסטנדרטית של mod_include
(המודול באפאצ'י אשר בו נמצא XSSI), כי יש בו מגבלות מהותיות. כדי לעקוף חלק מהן, מהנדס בשם בריאן שלסינסקי כתב גרסה מורחבת מיוחדת של מודול זה. גרסה זו כוללת שתי פקודות חדשות (parse-form ו- random) וכן מרחיבה את הוראת echo הקיימת.
בעזרת הפקודות החדשות הללו, אנו יכולים לבצע כל מיני טריקים בעמודים.
המשך לקרוא כדי להתרשם, או פשוט עבור להורדה והתקנה.

14.2 מה XSSI יכול לבצע?

פקודת random:
פקודה זו משמשת להטעין באופן אקראי אלמנט חדש על עמוד בכל פעם שמשתמש חוזר לביקור נוסף או לוחץ על Reload. אפשר ליצור זאת ע"י הוספת משתנה וקביעת פרמטרים נמוכים וגבוהים עבורו.
כך, כשהמשתמש מטעין מחדש את העמוד, תמונה שונה או טקסט שונה מופיעים, לפי מה שהמשתנה האקראי מצא.
להלן הקוד שמבצע זאת:
<!--#random var="rnd" low="1" high="3" -->
<!--#if expr="$rnd=1" -->
-do stuff-
<!--#elif expr="$rnd=2" --> 
-do stuff-
<!--#elif expr="$rnd=3" -->
-do stuff- 
<!--#endif -->

parse_form:
האם שמת לב שבזמן שאתה מבקר באתרי אינטרנט, תמיד יש קבוצה של דברים לכאורה חסרי משמעות ב- query string (ז"א, התווים האקראיים שבאים אחרי סימן השאלה בכתובת URL).
טוב, לא נוכל להסביר את הכל, כי לא הכל זה XSSI (זה עשוי להיות תוצר של ASP, Perl או שפה פרטית מוזרה אחרת), אך נוכל להראות לך מה מתרחש ב- query string שלנו. למזלכם (ולמזלנו) אנו עושים שימוש פשוט ב- parse form - אנו משתמשים בו לעקוב אחרי צפייה בעמודים וליצור עימוד באופן דינמי.
כדי לראות דוגמא פשטנית של כך, בדוק את הארכיב של Elbow Grease

העבר את הסמן שלך על הקישורים ל- Elbow Greases של חודש זה - תוכל לראות שכתובת ה- URL נשארת כמעט אותו דבר. אך אם תסתכל בקפדנות, תראה שהחלק אחרי סימן השאלה משתנה.
למשל :
http://www.hotwired.com/webmonkey/mail/elbo_archive/templ.html?M=02&D=15&Y=99 

כל הקישורים זהים מלבד מה שמופיע אחרי סימן השאלה.
קובץ ה- templ.html HTML הוא תבנית שמפרטת כל עמוד באותה צורה. באותו קובץ יש לנו תוספת וירטואלית כדלקמן :
<!--#include virtual="${form_Y}/elbogrease.${form_M}-${form_D}.htmlf" --> 

מה שקורה הוא כך: בתחילת ה- templ.html, שמנו את הפקודה <--parse_form#--!> המציינת: "הנה יש משהו ב- query string שאני צריך לקחת!", ואז parse_form יוצר משתנים מתוך ה- query string ומוסיף "_form" לתחילתם (אלא אם תגיד לו לא לעשות זאת).
ב- query string שלנו יש לנו : M=02, D=15 99=Y. לאחר שמבצעים חלוקה וניתוח על העמוד, התוספת הוירטואלית שלנו נראית כך:
<!--#include virtual="99/elbogrease.02-15.htmlf" -->

התוספת הוירטואלית יודעת איזה עמוד לקחת, ואתה תוכל לקרוא את הגיליון של Elbow Grease שרצית.

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

 

14.3 הורדה והתקנה

השלב הראשון הוא הורדת HotWired's XSSI Extension. ע"כ הורד את-
mod_include.tar.gz

ע"מ להתקין את HotWired's mod_include, פעל ע"פ הצעדים הבאים:

1. unzip הקובץ לתוך ספריית apache_1.3x/src/modules שלך, אשר ייצור ספרייה חדשה בשם
/apache_1.3x/src/modules/hotwired.
2. שנה את הקונפיגורציה ע"מ שיתווסף לו המודול החדש. תצטרך להיפטר מהגרסה הסטנדרטית של mod_include בקובץ הקונפיגורציה ולשנות אותו לגרסה החדשה.
יש לכך 3 דרכים אפשריות. בשתי הדרכים הראשונות, אתה נדרש לבצע קומפילציה של הקובץ לתוך הקוד הבינארי, כך:
./configure
--enable-module=hotwired/mod_include--disable-module=standard/mod_include
; make ; make install
שנה את השורה בקובץ הקונפיגורציה שלך מ:
AddModule modules/standard/mod_include.o
ל:
AddModule modules/hotwired/mod_include.o
ואז הקלד :
src/configure ; make ; make install

הדרך השלישית היא פשוט להשתמש ב- DSO.

אזהרה:
מודול זו נבדק רק על לינוקס ( Linux ) וסולאריס וטרם נבדק עם תמיכת DSO.
כמו כן המודול שלנו תוכנן לעבודה עם אפאצ'י 1.3.4 ויתכן שיהיו בעיות תאימות עם גרסאות מוקדמות יותר של אפאצ'י.
עתה שמודול זה מותקן ופועל אצלך, קרא הוראות כיצד להפוך את העמודים שלך לדינמיים ומעוררי התפלאות.
קרא על הוראות התקנה, דוגמאות ובגים ידועים ל- parse_form #random, echo.

 

14.4 התיעוד לפקודת parse_form

פקודת parse_form קוראת משתני צורה מה- STRING_QUERY ומשתמשת בהם כדי ליצור משתני סביבה. ע"י חלוקת משתנים אלה לזוגות (ראה דוגמא להלן), מתאפשר מעבר של יותר מפיסת מידע אחת מעמוד לעמוד.
כדי למנוע סתירות עם משתני סביבה קיימים, כל משתנה חדש מקבל תחילית - "_form".
כדי להתאים את parse_form לצרכיך, יש שני פרמטרים אופציונליים (אם כי ברוב המקרים הם אינם נדרשים):

1. "var =" varname
אם פרמטר זה נכלל, parse_form יקרא את משתני הצורה מתוך varname ולא מתוך query string.
השתמש בזה אם תרצה להשתמש במשתנה אחר כגון "PATH_INFO".
2. "prefix = "string
אם פרמטר זה נכלל, parse_form ישתמש ב- string, במקום התחילית _form, כתחילית ביצירת משתני סביבה.
השתמש בזה אם ברירת המחדל _FORM מתנגש עם משתנה אחר שיש לך או פשוט אם סתם בא לך או אם אתה לא רוצה להוסיף _FORM לכל דבר.

דוגמאות:

נניח שתקבע את המשתנים הבאים :
QUERY_STRING = X=3&Y=4
  FOO = Z=10

הפקודה:
  <!--#parse_form --> 

תיצור את המשתנים הבאים:
form_X = 3
form_Y = 4

והפקודה הבאה :
<!--#parse_form var="FOO" prefix="QQQ" -->

תיצור את המשתנה הבא:
QQQZ = 10 

התקנה:

הוסף "-DUSE_PARSE_FORM" לחלק בקובץ הקונפיגורציה של האפאצ'י המכונה "EXTRA_CFLAGS".

באגים:

אם ב- STRING_QUERY מופיע אותו משתנה פעמיים באותה שרשרת (למשל "X=38&X=4" ) אזי parse_form# יצור שני משתני סביבה בעלי אותו שם.
רק הראשון יהיה נגיש מתוך XSSI.

 

14.5 התיעוד לפקודת random#

פקודה חדשה זו מאפשרת לקבוע משתנה למספר integer אקראי בטווח מוגדר.
להלן הפרמטרים בהם תשתמש בפקודה זו:
"var= "varname - פרמטר זה קובע את שם המשתנה שייקבע.
"low ="integer - פרמטר זה קובע את הערך הנמוך של הטווח.
"high ="integer - פרמטר זה קובע את הערך הגבוה של הטווח.

דוגמא:

כך תוכל להשתמש בפקודה:

<--#random var="FOO" low="1" high="6" -->
Here is a random number between one and six: <--#echo var="FOO"-->. 

תוכל לשלב random# במשפטי if# כדי לבחור טקסט HTML באופן אקראי. למשל תוכל לקבוע את צבע הרקע של העמוד באופן אקראי בעזרת הקוד הבא:

  <!--#random var="X" low="1" high="3" -->
  <!--#if expr="$X=1" -->
<body bgcolor="#ff0000">
  <!--#elif expr="$X=2" -->
<body bgcolor="#00ff00">
  <!--#elif expr="$X=3" -->
<body bgcolor="#0000ff">
  <!--#endif --> 

התקנה:

הוסף "-DUSE_RANDOM_SSI" לחלק ה- "EXTRA_CFLAGS" בקובץ הקונפיגורציה של האפאצ'י.

באגים:

אין דרך להבטיח ש- low<=high.

 

14.6 התיעוד לפקודת echo#

echo# הוא פקודת XSSI סטנדרטית המדפיסה משתנה.
"var ="varname (ללא שינוי) - זהו שם המשתנה שיודפס.

ההרחבה של בריאן מוסיפה שתי אופציות נוספות המעניקות לך שליטה רבה יותר על מה שיודפס:
"default = "string (חדש).
אם קובעים פרמטר זה והמשתנה אינו מוגדר, יודפס string במקום "(none)".

"escape = "html (חדש).
אם קובעים פרמטר זה, ההחלפות הבאות תתבצענה כשיודפס המשתנה:
> הופך להיות lt&
< הופך להיות gt&
& הופך להיות amp&
& הופך להיות quot&

לדוגמא, נניח שהקוד הבא מבוצע :
<!--#set var="FOO" value="<p>" -->
  <p>First: <!--#echo var="FOO" -->
 <p>Second: <!--#echo var="FOO" escape="html" -->

"View Source" יציג את זה:
<p>First: <p>
  <p>Second: <p> 

הפלט של ה- echo# הראשון מתפרש כתג פסקה ואילו הפלט של ה- #echo השני מוצג כטקסט פשוט.

באגים:

אין שום דרך "לכבות" הרחבה זו אלא ע"י עריכת קוד ה- C ב- mod_include.c.

זהו זה! עתה יש לך הטכנולוגיה לבנות מחדש את עמודיך!