שלח תשובה

זירת השאלות

484
צפיות
14
תשובות

Sql injection ..בעיה

,‏ 2 בנובמבר, 2004

הנה שאילתת התחברות שהרכבתי לפני זמן רב .
רק היום שמתי לב כי זה פרוץ וניתן ליישם את שיטת הSql injection.

אני לא מצליח ליישם את השיטה ה2 שהוסברה במאמר כאן באתר מול הקוד שלי .
היכן להציב את הReplace וכיצד למקם את המשתנה בו הצבתי את הreplace בתוך השאילתה.

                 Set objConn = Server.CreateObject("ADODB.Connection")
                 Set objRs = Server.CreateObject("ADODB.Recordset")
                 objConn.Open strConn
                 objRs.Open "SELECT TOP 1 IDAuthor, AuthorNick, AuthorPassword, AuthorLevel FROM Author WHERE AuthorNick = '" &_
                  '" & AuthorNick & '" & "' AND AuthorPassword = '" &_
                   Request.Form("Password") &_
                    "'", objConn, 0, 1
                
                 If objRs.BOF And objRs.EOF Then
                
נתוני התחברות שגויים                
                 Else
                
נתוני התחברות נכונים
                
                 End If
                
                 objRs.Close
                 objConn.Close
                 Set objConn = Nothing
                 Set objRs = Nothing


אני מקווה שאני מובן
תודה מראש ידידיי .

תגיות:

14 תשובות

  1. ניר טייב הגיב:

    ….
    יש לך משתנה בשם AuthorNick ועוד קריאה למשתנה מסויים דרך Request.Form
    עליך להכניס את הערך שב – Request.Form לתוך משתנה נוסף.
    על שני המשתנים אתה מבצע ריפלייסים כמוסבר במאמר. אחרי שהריפלייסים בוצעו אתה משרשר את המשתנים לתוך השאילתא שלך.

  2. prince01 הגיב:

    כך עשיתי וזה לא עובד :
    ראשית, הכנסתי את הערכים לתוך משתנים

                             AuthorNick=Replace(Request.form("Nickname"),"'",""")AuthorPassword=Replace(Request("Password"),"'",""")

    ולאחר מכן תיקנתי את השאילתא שלי

    objRs.Open "SELECT TOP 1 IDAuthor, AuthorNick, AuthorPassword, AuthorLevel FROM Author WHERE AuthorNick = '" &_
    "& AuthorNick &"  & "' AND AuthorPassword = '" &_
    "& AuthorPassword &" &_
    "'", objConn, 0, 1

    וזה עדיין לא עובד :/

  3. prince01 הגיב:

    2 טעויות שלי ..
    1. בתגובה שהוספתי אין שבירת שורה בין הגדרת המשתנים (בחלק הקוד הראשון) .. זה לא כך אצלי , זה טעות הקלדה
    2. כשאני מגדיר את AuthorPassword כריפלייס, בקוד הקודם שכחתי להוסיף אחרי הrequest את הנקודה ואז form .. תוקן . אך עדיין לא עובד

  4. BuildHome הגיב:

    כנס למאמר
    על פונקצית ה-Replace ותדע כיצד להשתמש בפונקציה ומה צריך להחליף.

  5. prince01 הגיב:

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

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

    תודה

  6. BuildHome הגיב:

    שאילתה
    SQL = "SELECT username,password FROM users WHERE username='"&Request.Form("username")&"'"
    rs.Open SQL,Conn,3,3
    If rs.EOF Then
    '   המשתמש לא קיים
    Else
    '   המשתמש כבר קיים
    End If
    rs.Close

  7. prince01 הגיב:

    אם ערך הלולאה נכון אז …
    לבנות (במקום איפה שרשמת "משתמש לא קיים") את השאילתה שתוסיף לי את המשתמש למסד נתונים ?

  8. ניר טייב הגיב:

    אפשר גם כך
    ברמת המסד לעשות שהעמודה תאופיין כ- unique ואז פשוט לעשות try…catch
    או  On error Resume Next על ההכנסה…
    אם יוצאת שגיאה סימן שהמשתמש קיים (תבדוק את סוג השגיאה כמובן…) אם לא אז הכל סבבה…

    אבל חכה עד שמישהו יאשר ישלול את הדרך הזו
    או שתעשה בדיקה מה יותר מהיר…

  9. prince01 הגיב:

    אני אנסה את שניהם ..
    אני מאמין שברמת המסד זה יהיה לי יותר מהיר ..
    אבל אני אבדוק את שניהם

    תודה רבה לשניכם

  10. ניר טייב הגיב:

    רק סימון העמודה כ-unique זה
    ברמת המסד. השאר מתבצע ברמת הסקריפט בשרת.

  11. prince01 הגיב:

    שאלה חדשה (ספירת רשומות) …
    כיצד אני יכול לספור את כמות הרשומות
    שיש לי לפי "where" מסויים .

    דוגמא : אם יש לי דף המכיל את כל הרשומות אשר הf_id שלהם הוא 10 (שדה אשר מכיל את הID של קטגורייה מסויימת בטבלה אחרת).
    והשאילתה נראית כך (לצורך העניין) :


    Select * FROM someTable Where id=10

    מה שאני רוצה , זה לספור כמה רשומות יש ובהן המספר 10 מופיע בשדה הf_id .
    כיצד זה אפשרי ?

    תודה

  12. prince01 הגיב:

    תיקון קטן ..
    בקוד שהצגתי :
    select * from someTable where f_id=10

  13. BuildHome הגיב:

    תשובה
    SELECT COUNT(f_id) AS intCount FROM someTable WHERE f_id=10

    rs("intCount")

  14. prince01 הגיב:

    התייעצות .
    אני מעוניין בנתינת שירות חופשי של Counter לאתרים של גולשים שונים.
    כמובן אני מתכנת בASP במסדי נתונים מסוג Access .

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

    תודה מראש ידידיי .

שלח תשובה