שלח תשובה

זירת השאלות

832
צפיות
6
תשובות

אבטחה מפני xss &sql injection

,‏ 10 באוגוסט, 2008

היי
לאחר שקראתי המון מסמכים ובהמון פורומים בארץ ובעולם לגבי אבטחת מפני 2 האיומים sql injection ו xss רציתי לשאול מה באמת הדרך הטובה ביותר להלביש אבטחה על אתר בנוי?
האתר בנוי ב ASP ו MSSQL ולא עושה שימוש ב stored procedures לשם הגנה.
נכון שאפשר להגביל את כל התווים ה"מיוחדים" ונכון שאפשר להגביל שמספרים יהיו רק מספרים אבל השאלה היא לגבי שדה של טקסט חופשי אילו עוד תווים חייבים לחסום (ועדיין לתת למשתמש אפשרות די חופשית להקליד טקסט בשדה).
האם מספיק להחליף את ' ל " ולמנוע את — ואת > ו <
?יש עוד משהו שחסר כאן?

תודה מראש לעוזרים

תגיות:

6 תשובות

  1. lllb הגיב:

    האם מספיק?
    לאחר חשיבה בניתי את זה.
    txt=request.querystring("txt")
    txt=replace(txt,"'",""")
    txt=replace(txt,">",">")
    txt=replace(txt,"<","<")
    txt=replace(txt,"–","--")

    האם מספיק לטפל רק בתווים האלו?
    אני לא מצאתי דרך לשתול SQL INJECTION
    בלי לסגור עם ' ולפעמים גם צריך לשהתמש ב —
    ולגבי סקריפט, יש טעם להגן על עוד דברים מעבר לסימנים > ו < ? כי הם הרי יכסו את האפשרות להקליד תגיות
    תקנו אותי אם אני טועה או אם יש לכם משהו להוסיף

  2. samiprogram הגיב:

    אני לא מבין למה את מוחק תווים
    הנה פונקצייה בASP שאני משתמש כשצריך לקבל טקסט ולהכניס אל תוך SQL

    function clr(str)
    temp = str
    temp = replace(temp,"'","'")
    temp = replace(temp,chr(34),""")
    clr = temp
    end function

    אני מחליף את התו ' ואת התו " למקביל שלהם בתווי HTML מיוחדים. התוו הזה מפוענח על ידי הדפדפן כתו ' או ".
    כשצריך להכניס טקסט לSQL אין מה לפחד מתווי >< כיוון שזה נכנס בתוך המחרוזת.
    וכשצריך להכניס ערך מספרי לSQL חשוב לוודא שהערך הוא מספרי ולא מלא באופרטורים כדוגמת: < + > = ועוד… אתה עושה תנאי

    if not isnumeric(str) then str = 0

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

  3. lllb הגיב:

    מה שאתה אומר..
    נכון נגד התקפות SQL INJECTION למרות שחשבתי לפעמים שצריך גם להוסיף לרשימה את — אבל אני בספק אם הוא יכול ליצור בעיות בכלל אם מחליפים את ' ואת "
    עדיין קוד כזה יקבל ל DB מחרוזת כזו <u>aaa</u> ויעבד ויציג אותה בתוך HTML בעמוד וזה קוד שלא יכול לגרום לכלום אבל יש קודים יותר מסוכנים

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

  4. samiprogram הגיב:

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

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

    במקרה של טקסט עשיר זה יותר מורכב כי אתה צריך לאמת את התגיות בצד שרת ולבדוק שאין תגיות מסוכנות. יש לזה פונקצייה בPHPH אבל בניתי לזה בASP אתה פשוט מריץ לולאה לפי הסימנים <>

  5. lllb הגיב:

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

  6. samiprogram הגיב:

    יש אפשרות
    אם תכניס את הטקסט לא דרך SQL INSERT או UPDATE אלא דרך הפונקציות הקיימות באובייקט הרקורדסט (לא כ"כ מומלץ).

    יש על זה מאמר במדור ASP באתר. זה נקרא דרכים להימנע מבעיות גרשיים.

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

    זו הדרך איתה אני עובד ואני חושב שזה הדרך הטוב ביותר.

    בהצלחה.

שלח תשובה