שלח תשובה

זירת השאלות

751
צפיות
11
תשובות

הודעת שגיאה 0x80040E07

,‏ 21 באוקטובר, 2008

שלום!

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


Microsoft OLE DB Provider for ODBC Drivers (0x80040E07)
[Microsoft][ODBC Microsoft Access Driver] Data type mismatch in criteria expression.


יש לי את הקוד הבא לעדכון הנתונים (זה טופס עדכון פרטי משתמש שכבר רשום באתר):


sqlUpdate="UPDATE users SET user_nick = '" & user_nick & "', user_password = '" & user_pwd & "', user_email = '" & user_email & "', gender_link = '" & gender_link & "', user_birthday = '" & user_bd & "', user_pic = '" & user_pic & "', city_link = '" & city_link & "', user_name = '" & user_name & "', user_show_email = '" & show_email & "', permission_link = '" & permission_link & "', user_status = '" & user_status & "' where user_id = " & user_id


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

תודה רבה!

תגיות:

11 תשובות

  1. alikl הגיב:

    בדיקת קלט
    יגאל55555
    ברצוני להסב תשומת לבך לשני דברים:
    1. לפני שאתה שלב את הנתונינם בתוך מחרוז SQL אתה צריך לבדוק אותם. מומלץ לבדוק את הנתונון שהוא מסוג הנכון, טווח, נכון, אורן נכון ותבנית נכונה. כבר בשלב של הבדיקה הזו תוכל לזהות את הנתון הלא תקין.
    2. בדיקה הזו תעזורת לך למנוע בעיות אבטחת מידע כגון הזרקת משפטי SQL – נכון לכרגע הקוד שלך פגיע ביותר, אתה משתמש בSQL דינאמי, המקור לבעיות SQL Injections.
    אתה צריך לכתוב Parameterized Queries.
    לגופו של עניין בדיקת קלט לפני שילוב במשפט ה-SQL אמור לפתור את הבעיה שלך בקלות
    HTH
    אליק

  2. יגאל55555 הגיב:

    היי אליק
    קודם כל תודה רבה על ההתייחסות ועל התשובה!

    אני לא כ"כ בקיא בתכנות, לכן אמנם הבנתי את מה שאתה אומר, אך אין לי מושג איך לעשות את זה?
    איך אני בודק את הנתונים? איך עושים בדיקת קלט? האם יש לך אולי דוגמאות מוכנות עובדות שאוכל לראות?

    תודה רבה!

  3. alikl הגיב:

    אליק > גיא55555
    מה שפת קוד  שרת שלך?
    עם אתה כותב ב-ASP.NETC#  אז החומר הזה אמור לעזור.
    How To: Protect From SQL Injection in ASP.NET
    http://msdn.microsoft.com/en-us/library/ms998271.aspx

    הקטע המרכזי הוא:
    using System.Data;
    using System.Data.SqlClient;

    using (SqlConnection connection = new SqlConnection(connectionString))
    {
      DataSet userDataset = new DataSet();
      SqlDataAdapter myDataAdapter = new SqlDataAdapter(
             "SELECT au_lname, au_fname FROM Authors WHERE au_id = @au_id",
             connection);                
      myCommand.SelectCommand.Parameters.Add("@au_id", SqlDbType.VarChar, 11);
      myCommand.SelectCommand.Parameters["@au_id"].Value = SSN.Text;
      myDataAdapter.Fill(userDataset);
    }

    זה אמור לעזור לך למנוע התקפות מסוג SQL Injection וגם להבין איזה מפרמטרים אינו תואם לזה שמוגדר ב-DB

  4. vsystems הגיב:

    הייתי מציע לך לעשות את הבדיקה הבאה:
    להכניס את כל ה SQLSTRING למשתנה – ולהדפיס אותו ככה יצא לך את השאילתה שאתה מנסה להפעיל על המסד נתונים עם המשתנים למשל
    id = 3
    sqlstr="select * from table where id="&id
    response.write(sqlstr)
    select * from table where id=3
    ואם תעשה את זה על הSTRING של ה UPDATE זה יראה לך את הנתונים שאתה מנסה לשייך , רוב הסיכויים שאתה מנסה להכניס משתנה אותיות לתא של מספר , או תאריך..
    אחרי שתעשה את זה תפרסם פה אם עדיין לא תצליח לפתור


        Dvir Levanon | HTML
    Museum Tower, 23rd floor, 4 Berkovitz St. Tel-Aviv 64238
    Tel: 0506593357
    Web Site: http://www.vise.co.il
    E-mail:[email protected]
    <img src="http://www.donkey.co.il/Briefcase/Uploads/35968.sign.jpg&quot; border="0">

  5. יגאל55555 הגיב:

    לא בדיוק עובד…
    היסיתי לעשות את ההדפסה הבאה (אולי לא הבנתי משהו):


    dim sql
    set rs=Server.CreateObject("ADODB.recordset")
    sql="select * from users where user_id = 1"
    rs.Open sql, connSite

    Response.Write (sql)

    rs.Close
    set rs=nothing

    מן הסתם מה שזה הדפיס לי זה את השורה
    select * from users where user_id = 1

    ניסיתי לעשות את ההדפסה הזאת:


    Response.Write rs("user_full_name")

    וזה אכן הדפיס לי את השם.

    גם הטופס עצמו הוא טופס עדכון של ה-DB והוא שולף נתונים ממנו, לכן כאשר יש לי למשל תיבת שם הערך שמופיע בה הוא השם שמופיע ב-DB. אני יכול לשנות אותו וכאשר אני לוחץ על לחצן "שלח" אז זה אמור לעדכן את ה-DB.

    עכשיו ניסיתי למחוק משורת העדכון את הערל האחרון, שאמור להיות הבעיתי כביכול, ועדיין קיבלתי שגיאת TYPE MISMATCH. בדקתי ב-DB – כל השדות מסומנים נכון, טקסט איפה שצריך להיות טקסט, מספר איפה שצריך להיות מספר, YES/NO איפה שצריך להיות YES/NO… אז למה זה לא עובד? איפה הבעיה כאן???

    נ.ב. לא הבנתי איך ומה אני אמור לעשות עם ה-STRING של ה-UPDATE… ביקשתי להדפיס פשוט את הנתונים הנשלחים מטופס וזה הדפיס אותם בדיוק כפי שהם, כלומר טקסט היה טקסט, מספר היה מספר…

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

    לטובת מי שלא מכיר – הבלוג של אליק – מומלץ להוסיף לקורא rss שלכם


    אלי ענתבי

  7. vsystems הגיב:

    היי התכוונתי לדבר הבא:
    לדוגמא:
    אני מכיר 2 אפשרויות לעשות UPDATE
    1)
    con.execute("UPDATE booksection SET sum = sum + 1 WHERE id="&catagory)

    2)
    s.open sqlstr, Con , 2, 3
        rs("posttile") = ptitle
        rs.Update

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


        Dvir Levanon | HTML
    Museum Tower, 23rd floor, 4 Berkovitz St. Tel-Aviv 64238
    Tel: 0506593357
    Web Site: http://www.vise.co.il
    E-mail:[email protected]
    <img src="http://www.donkey.co.il/Briefcase/Uploads/35968.sign.jpg&quot; border="0">

  8. vsystems הגיב:

    בגדול הייתי שמח אם היית מדפיס את זה
    המשתנה הבא: sqlUpdate
    ומראה לנו מה הוא מציק , אולי בעיה של נקודה פסיק וכו'


        Dvir Levanon | HTML
    Museum Tower, 23rd floor, 4 Berkovitz St. Tel-Aviv 64238
    Tel: 0506593357
    Web Site: http://www.vise.co.il
    E-mail:[email protected]
    <img src="http://www.donkey.co.il/Briefcase/Uploads/35968.sign.jpg&quot; border="0">

  9. יגאל55555 הגיב:

    הבעיה נפתרה!
    מאד מודה על העזרה! עכשיו זה עובד!

    אבל עכשיו יש לי עוד בעיה אחת – אפתח נושא חדש עבור זה…

שלח תשובה