למה חשוב להשתמש בStoredProcedured

בינארית

New member
למה חשוב להשתמש בStoredProcedured

StoredProcedures הם פונקציות SQL שנשמרות בשרת הדטה בייס מקומפלות. היתרונות בשימוש בStoredProcedures: 1. בתהליך שמירת הsp בשרת, מתבצעות עליו פעולות האופטימיזציה ולכן הגישה אליו והשימוש בו הוא מהיר יותר. 2. שימוש בsp מונע מידע גלוי (נתונים על הטבלאות, שדות) על הדטה בייס בדפי האתר, וזאת מכיוון שהן שמורות בדטה בייס עצמו. המידע הגלוי היחיד הינו שם הפרוצדורה שרוצים להפעיל. (לא כותבים את שאילתות ה-SQL בעצמן בדפי האתר) 3. sp מונעים התקפת SqlInjection, התקפה בה מכניסים טקסט זדוני הגורם לשאילתת הsql לשנות את הבקשה המקורית לבקשה שאותה רצה המתקיף. הסיבה למניעת ההתקפה היא משום שכל שדה הטקסט נשלח כמחרוזת לפרוצדורה.
 

ZeroSum

New member
את פותחת פה תיבת פנדורה ../images/Emo8.gif

המאבק בין Stored Procedures ל-Inline SQL הינו ישן נושן. 1. בסיסי נתונים מודרניים יודעים לבצע אופטימיזציות גם על פקודות SQL שאינן Stored Procedures 2. בכל מקרה, בדפי האתר אסור לקרוא לא ל-Inline SQL ולא ל-Stored Procedure 3. גם Inline SQL ביחד עם שימוש ב-Parameters מספק הגנה זהה מפני SQL Injections יש מקרי קצה בהם הייתי משתמש ב-SP, בכל שאר המקרים אני מעדיף Inline SQL, ולו מהסיבה הפשוטה שלא צריך לעדכן ב-2 מקומות כל שינוי ב-DB.
 

pelegk2

New member
הלינק שנתת לי עדכני בחלקו

הוא מתייחס ל SQL7/2000 שלאט לאט נעלמים מהעולם ב 2005/2008 זה כבר סיפור אחר כל עניין ה SP http://msdn.microsoft.com/en-us/library/ms181055.aspx כל עניין ה CACHE של SP השתנה ויותר נכון לעבוד עם SP ולא עם שאילתות INLINE בדפים שלך זו גישה מוטעתף ובאבטחת מידע היא בחיים לא הייתי שם שאילתה בדף WEB ולא הבנתי את סעיף 3 שלך : "גם Inline SQL ביחד עם שימוש ב-Parameters מספק הגנה זהה מפני SQL Injections"??? איך הפרמטר מספק לך הגנה?
 
השאילתה לא אמורה להיות בדף ה - Web

אלא בשכבת ה - DAL שלך. ב - Inline SQL עם פרמטרים לא ניתן להזריק SQL בדיוק כמו שב - SP לא ניתן. (לא מדוייק שלא ניתן, בשתי השיטות ניתן אם משתמשים ב - EXEC ושרשור מחרוזות, אבל זה סיפור אחר). יותר נכון לעבוד עם שכבת DAL או כלי ORM שעושה את העבודה, במקום לעשות את הכל בעצמך.
 

בינארית

New member
רק משהו קטן לגבי הסעיף הראשון

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

1. אולי יש עדיפות קלה לביצועים ב SP . מבחינתי זה עדיין בעיה לתחזק את האפליקציה בשני מקומות במקום רק במקום אחד. בגלל זה אני מעדיף שה DB רק ישמור נתונים. 2. לגבי SQL Injection (להלן SI), אם משתמשים בפרמטרים וב ADO.Net כשכבת ה"דרייבר" ל DB, (למתכנתי דוט נט, כמובן), אז יש הגנה מספיק טובה ל SI, גם ב inline sql. תקנו אותי אם אני טועה. אפשר לראות בפרופיילר שה ADO.Net "מנרמל" את הקלט כך שיהיה תקין (למשל, משכפל גרש).
 

DevArea

New member
לא בכל מצב. זה כשמשתמשים עם SqlCommand

ו SqlParameters, ולא משרשרים ישירות.
 

gamani4

New member
אבקשר ל3-

SP לא מונעים 100%, אלא מסייעים במניעה. מספר פעמים הייתי צריך לכתוב SQL דינאמי, אבל היות שבמקום העבודה שלי עובדים רק עם SP, זה היה צריך להיות קוד דינאמי בתוך הSP. אם לא הייתי מקפיד שם, אז גם שם היה יכול להיות sql injection.
 

gamani4

New member
דוגמא

מצורף קוד, כי תפוז מתחרפן כשאני עותב אותו פה... זה קורה רק כשמשתמשים בsql דינאמי. הפתרון, לפחות באורקל, הוא שימוש בbind variables.
 
לא מדויק...

1. למיטב ידיעתי במסדי הנתונים המודרניים יש אופטימיזציות גם על SQL דינאמי, כך שאם לדוגמה יש שאילתה מסויימת שקוראים לה הרבה פעמים עם ערכים שונים - מסד הנתונים יזהה את זה ויבצע לה קומפילציה בהתאם. יכול להיות שיפור מסויים בביצועים בגלל תעבורה נמוכה יותר לשרת של מסד הנתונים, אם יש פרוצדורה שעושה הרבה שאילתות, אז מעבירים רק את שם הפרוצדורה במקום את כל השאילתות השונות. 2. אין שום סיבה שאפליקצית web תחשוף מידע על הקוד שרץ בה. אם יש מצב שבו אפליקציה חושפת מידע כזה זה כבר חור אבטחה שצריך לחסום. 3. גם stored procedures חשופות לsql injection במקרים מסוימים - בכל מקרה צריך לדאוג לסנן קלט שמגיע מהמשתנה, לא צריך לסמוך על מנגנון כזה או אחר שיעשה את זה בשבילנו.
 

בינארית

New member
אוקי

באיזה מקרים גם stored procedures חשופות לsql injection? מה לדעתך הדרך הטובה ביותר להגן מפני SQL INJECTION? האם הכפלת התו ' היא פתרון?
 
תלוי במסד נתונים ובשפת תכנות...

נתנו כבר מעלי דוגמה לinjection, יש הבדלים בין מסדי הנתונים השונים אז זה מאוד תלוי במסד הנתונים הספציפי. בקשר למניעת injection - אם מדובר במשתנים מספריים אז אפשר פשוט לוודא שזה באמת מספר. אם מדובר על מחרוזת - זה תלוי יותר בשפת התכנות / מסד הנתונים. לדוגמה, בספריה של mysql יש פונקציה בשם real_escape_string שמונעת injection - הפונקציה הזאת לוקחת מחרוזת ומחזירה אותה בצורה בטוחה להכנסה למסד נתונים. לפונקציה הזאת קוראים מתוך שפת התכנות שבה משתמשים, זו לא פונקציית SQL.
 
הדרך הטובה ביותר נגד SQL injection

(שהיא לא SP) היא לפי דעתי פרמטר בגלל שהערך של הפרמטר מועבר כפי שהוא ל-DB (לא משנה אם הוא מכיל ')
 
למעלה