צפיות
תשובות
הודעת שגיאה 0x80040E07
שלום!
אני כאשר אני ממלא טופס באתר ושולח את הנתונים לדיבי, אני מקבל הודעת שגיאה הבאה:
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 תשובות
בדיקת קלט
יגאל55555
ברצוני להסב תשומת לבך לשני דברים:
1. לפני שאתה שלב את הנתונינם בתוך מחרוז SQL אתה צריך לבדוק אותם. מומלץ לבדוק את הנתונון שהוא מסוג הנכון, טווח, נכון, אורן נכון ותבנית נכונה. כבר בשלב של הבדיקה הזו תוכל לזהות את הנתון הלא תקין.
2. בדיקה הזו תעזורת לך למנוע בעיות אבטחת מידע כגון הזרקת משפטי SQL – נכון לכרגע הקוד שלך פגיע ביותר, אתה משתמש בSQL דינאמי, המקור לבעיות SQL Injections.
אתה צריך לכתוב Parameterized Queries.
לגופו של עניין בדיקת קלט לפני שילוב במשפט ה-SQL אמור לפתור את הבעיה שלך בקלות
HTH
אליק
היי אליק
קודם כל תודה רבה על ההתייחסות ועל התשובה!
אני לא כ"כ בקיא בתכנות, לכן אמנם הבנתי את מה שאתה אומר, אך אין לי מושג איך לעשות את זה?
איך אני בודק את הנתונים? איך עושים בדיקת קלט? האם יש לך אולי דוגמאות מוכנות עובדות שאוכל לראות?
תודה רבה!
אליק > גיא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
אני משתמש ב-ASP VBScript
הייתי מציע לך לעשות את הבדיקה הבאה:
להכניס את כל ה 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" border="0">
How To Call a Parameterized Query to an
http://support.microsoft.com/kb/200190/en-us
לא בדיוק עובד…
היסיתי לעשות את ההדפסה הבאה (אולי לא הבנתי משהו):
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… ביקשתי להדפיס פשוט את הנתונים הנשלחים מטופס וזה הדפיס אותם בדיוק כפי שהם, כלומר טקסט היה טקסט, מספר היה מספר…
אליק, רק מילה מחוץ לקשר של השירשור הזה,
אני מניח שהגעת אלינו לאתר בעקבות פרסום כמה קישורים לפוסטים בבלוג שלך, ורק רוצה להגיד שהבלוג שלך הוא בלוג יוצא מן הכלל באיכותו, ולומר לך שאתה אורח/משתתף מאוד מאוד רצוי כאן בוובמאסטר.
לטובת מי שלא מכיר – הבלוג של אליק – מומלץ להוסיף לקורא rss שלכם
אלי ענתבי
היי התכוונתי לדבר הבא:
לדוגמא:
אני מכיר 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" border="0">
בגדול הייתי שמח אם היית מדפיס את זה
המשתנה הבא: 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" border="0">
הבעיה נפתרה!
מאד מודה על העזרה! עכשיו זה עובד!
אבל עכשיו יש לי עוד בעיה אחת – אפתח נושא חדש עבור זה…