Jump to content
  • הצטרפו למשפחה

    היי, היי אתה (או את) שם!

    אנחנו יודעים, נחמד להיות אנונימי, ולמי בכלל יש כוח להירשם או להיות עכשיו "החדשים האלה".

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

    אז קדימה, למה אתם מחכים? בואו והצטרפו ותהיו חלק מהמשפחה הקצת דפוקה שלנו.
     

שאלה ב C# ו SQL


Alon_A
dir="rtl" style="text-align:right;"> שימו לב! השרשור הזה בן 5466 ימים, שזה ממש ממש הרבה ולכן הוא ננעל.

אם אתם פותחי השרשור ו/או יש לכם עדכון רלוונטי לנושא - פנו לאחד המנהלים ונפתח את השרשור חזרה לתגובות.

פוסטים מומלצים

פורסם
ספציפי לשאילתה הזאת אני מעדיף עם המחרוזת.

סתם מתוך סקרנות, למה?

אני לא יכול לחשוב אפילו על יתרון אחד.

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

פורסם

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

 

כמו-כן,

בפונקציה הזו יהיו הרבה תנאים, בכל אחד צריכה להיות שאילתה שונה. יותר נוח, לדעתי, לכתוב את זה כך, בצורה של "הפרדת" השאילתות וקביעת השאילתה הרצויה בהתחלת הפונקציה, ואז הביצוע שלה.

 

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

ד"א - בכל השאילתות האחרות בתוכנה אני משתמש ב ADD PARAMETERS.

 

    public DataSet searchPackages(int searchType, string customer, string status, DateTime frDate, DateTime toDate)
       {

           SqlConnection connection;
           SqlCommand command;
           SqlDataAdapter adapter = new SqlDataAdapter();
           DataSet ds = new DataSet();
           string sql = null;

           if (searchType == 1)
           {
               sql = "SELECT * FROM RMA_Package WHERE customer = '" + customer + "' ";        
           }

           if (searchType == 2)
           {
               sql = "SELECT * FROM RMA_Package WHERE status = '" + status + "' ";
           }

           if (searchType == 1234) //start_date >= '" + frDate + "' AND start_date             {
               sql = "SELECT * FROM RMA_Package WHERE start_date >= '" + frDate.ToString("MM/dd/yyyy") + "' AND customer = '" + customer + "' ";
           }

           connection = new SqlConnection(Sys.connectionString);

           try
           {
               connection.Open();
               command = new SqlCommand(sql, connection);
               adapter.SelectCommand = command;
               adapter.Fill(ds, "SQL Temp Table");
               adapter.Dispose();
               command.Dispose();
               connection.Close();

               //MessageBox.Show ("Number of row(s) - " + ds.Tables[0].Rows.Count);
               return (ds);

           }
           catch (Exception ex)
           {
               MessageBox.Show(ex.ToString());
               return (null);
           }

 

 

 

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

 

  DateTime endDate = calcdate.AddDays(numOfDays);
               SqlConnection sq = new SqlConnection(Sys.connectionString);

               SqlDataAdapter dab = new SqlDataAdapter("select  c.Name from tblOrder o right outer join tblChalet c on o.Name=c.Name where c.Name NOT IN(select o.Name from tblOrder o where( @startDate between o.EntryDate and DATEADD(day,-1,o.ExitDate))or DATEADD(day,-1,@endDate) between o.EntryDate and DATEADD(day,-1,o.ExitDate)or o.EntryDate between @startDate and DATEADD(day,-1,@endDate))and c.IsProper='YES' group by c.Name", sq);
               dab.SelectCommand.Parameters.AddWithValue("@startDate", startDate);
               dab.SelectCommand.Parameters.AddWithValue("@endDate", endDate);

SAY MY NAME | www.alonadler.com

פורסם

מוזר שלא דיברו אתכם על sql injection (גוגל).

ברור שאם אתה רוצה שמשהו יעבוד וזהו, הכי זריז זה להכניס הכול במחרוזות ויאללה.

הבעיה במחרוזות היא שאפשר להכניס במחרוזת משהו שימחק לך את ה-DATABASE בשנייה.

למשל, בשורה הזאת:

sql = "SELECT * FROM RMA_Package WHERE customer = '" + customer +

 

אם אני אכניס customer שהשם שלו הוא משהו כמו "or drop database'" (שים לב לגרש היחיד בהתחלה)

או drop table אם אני ממש נחמד, הלך לך ה-database. ההסבר פה:

http://en.wikipedia.org/wiki/SQL_injection

(מעניין, נראה כאילו העתקת את הקוד מאיפה שהוא... :wink:)

 

כשאתה משתמש ב-SQL PARAMETERS, מתבצע ניקוי אוטומטי של המחרוזות,

שמקטין משמעותית את הסיכוי ל"הזרקה" קטלנית.

 

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

לא צריך להסתבך עם פורמטים.

 

בנוסף (2) תוכל לקצר משמעותית את הקוד עם שימוש ב-switch/case, אבל זה כבר סיפור אחר.

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

×
×
  • תוכן חדש...