שאלה ב-c

matliv

New member
שאלה ב-c

מה ההבדל בין הפונקציות
cin.getline()​
ו-
gets()​
?
 

galh

New member
לא ממש C. ../images/Emo13.gif

הפונקציה הראשונה היא קריאה לפונקציה של אובייקט ב- ++C. השניה היא פונקציה "רגילה" של C. אגב, מאחר ואין לך דרך להגביל את גודל הקלט ב- gets אסור לך להשתמש בה בשום פנים באופן (חוץ אולי מתוכנית בדיקה קטנה, אבל עדיף לשכוח שהיא קיימת). יש לך "תחליף הולם" עם הפונקציה fgets.
 

erezsh

New member
לא צריך להיות פאנאטיים

אלא אם כן אתה כותב תוכנה מקצועית, או תוכנה הדורשת security, שימוש ב-gets הוא בסדר גמור. הפאנאטיות הזו היא מטופשת - שהרי אז גם תצטרך לבדוק int overflow לפני כל אילקוץ ושהתוצאה של strlen אינה שלילית וכו'.
 

annefan

New member
נכון!

ככה אמרו המתכנתים לפני באג 2000, ככה אמרו המתכנתים של windows (ובגלל זה שוב יש ארבע פרצות אבטחה קריטיות). למה ללמד את עצמך שטויות? gets היא פונקציה רעה! כדאי מאוד לבדוק ערכים חזרה של strlen. יבוא יום שגם אתה תקלל את המתכנת שאת הקוד שלו אתה מתחזק, על זה שהוא לא בדק ערך חזרה כי הוא היה בטוח במאה אחוז שהקריאה לא יכולה להיכשל!
 

erezsh

New member
את האמת,

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

OriIdan

New member
חורים בחלונות

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

DNile

New member
עכשיו גם הוכחת

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

OriIdan

New member
למה?

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

DNile

New member
עם כל הכבוד לתכנות LL,

ובניית "מערכת הפעלה" משל עצמך, במערכת ההפעלה של מיקרוסופט הפגנת בורות מוחלטת. הרי איזה אבטחה אתה באמת צריך ב"מיני מערכת הפעלה" שלך? הקביעה שלך שחלונות נבנתה ללא כל אבטחה, ושהאבטחה הולבשה עליה באמצעות פאטצ'ים זה בולשיט מוחלט. כל מה שצריך לעשות זה ללמוד קצת על מנגנון האבטחה בחלונות 2000 ומעלה כדי לדעת איזה מאמצים עצומים נעשו שם. זה שכל משתמש מחליט לרוץ על המחשב בתור אדמיניסטרטור, וזה שכל תוכנה שהוא מריץ בתור אדמיניסטרטור יכולה להיות לה בעיית אבטחה שפותחת את כל המחשב, לא אומר שמערכת ההפעלה נטולה אבטחה. וbuffer overflows, עם כל הכבוד, זה משהו שאתה לעולם לא תצליח להפטר מהם. בדיוק כמו שלעולם לא תצליח להפטר מבאגים. הבעיה היא כשהבאגים האלה נמצאים בתוך שירותים קריטיים של מערכת ההפעלה, ואז אפשר לנצל אותם לרעה. אז בוא אני אשאל אותך, בתור בן אדם עם הרבה מאוד נסיון בכתיבת מערכות הפעלה(נסיון שיש בד"כ לכמעט כל מי שיצא לו לכתוב לEmbedded), אם אתה היית מיקרוסופט, איך אתה היית מנהל את העניינים אחרת?
 

OriIdan

New member
נראה שאתה זה שלא ממש מבין...

אבטחה יש בכל דבר שאתה כותב שמשתמש אחר צריך להשתמש בו. לגבי מנגנון האבטחה של חלונות 2000 אני לא ממש מבין כי לשמחתי מעולם לא השתמשתי בחלונות בגרסה מעל 98. אבל ממה שאני רואה כל יום יש פרצות אבטחה גם בשרתים מבוססים חלונות 2000 ומעלה ששם אני מניח שמנהלי השרתים יודעים קצת ולא מריצים הכל כאדמיניסטרטור אז הנקודה של המשתמשים הבורים היא לא ממש תירוץ. לגבי buffer overflow לכל התוכנות שכתבתי עד היום ומדובר במליוני שורות קוד לא היו בעיות buffer overflow זה לא אומר שלא היו באגים, היו המון באגים אבל לא כאלו טריוויאליים. גם מתכנתים שעבדו איתי גם כאלו ללא ניסיון לא כתבו תוכנות עם buffer overflow. איך זה? כי זה מאד פשוט להמנע בבעיות כאלו, בעיקר מי שעובד עם מערכות embedded ששם אין הרבה זכרון בדרך כלל. אם הייתי מיקרוסופט איך הייתי מנהל את העניינים אחרת? קודם כל זו לא שאלה טכנית אלא שאלה מסחרית. התשובה שלי פשוטה מאד, משתמש בקוד פתוח, שזה מודל פיתוח אמין יותר בעיקר לתוכנות ענק כמו מערכת הפעלה למחשבי PC.
 

DNile

New member
יפה,

אז אמרת בעצמך שאתה בור לגבי האבטחה ב2000, חבל שאתה מבסס טענות על סמך הבורות הזאת. לגבי זה שכתבת עד היום מליוני שורות קוד ולא היו לך בעיות Buffer overflow? תהיי בריא. כתבת עד היום מליוני שורות קוד, ולא מצאת את הBuffer overflows אצלך.
 

OriIdan

New member
אתה יכול להמשיך לזלזל

בעיות Buffer overflow מתגלות מהר מאד במערכות שלי מאחר וכל גודלו של ה buffer הוא בערך 32 בתים...
אני חושב עדיין שלאחר 20 שנה של תכנות יש לי קצת ידע וניסיון בנושא. אני אישית כתבתי מליוני שורות קוד ומתכנתים שעבדו אצלי כתבו מאות אלפי שורות קוד, כולן עבדו וחלק מהתוכנות עדיין עובדות ויתכן ואפילו אתה משתמש בהן כשאתה לוקח סרט וידאו מאוטומט להשכרת סרטים, בחלק מהאוטומטים יש קוד שלי והקוד הזה כולל הכל החל מהפעלת הרובוט ועד חיוב כרטיס האשראי שלך. אם אתה חושב ששם אין עניין של אבטחה אז איפה יש? חלק חשוב מדרישות הלקוח במקרה הזה היה אבטחה והלקוח עשה על זה מאות בדיקות, כמובן שהוא גילה באגים ואפילו לא מעט אבל אף פעם לא היה buffer overflow. כששמעתי שבחלונות יש בעיות כאלו, די נדהמתי כי כשאני למדתי תכנות, הדבר הראשון שלמדו אותי היה שלפני כל העתקה של string בשפה כמו C או אסמבלי יש לבדוק שיש מקום מספיק במקום אליו מעתיקים וזו רק דוגמה אחת. איך אתה מסביר את זה ששרתים של windows 2000 נפרצים כל יום ונופלים כל יום. בעוד שרתים מבוססי לינוקס ואפאצ'י לא נפרצים ולא נופלים? זה רק מראה שאפשר ולא יותר מדי מסובך לכתוב דברים ללא בעיות אבטחה.
 

DNile

New member
עצוב אם במשך 20 שנה

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

erezsh

New member
אתה בטוח מאוד בעצמך

בהתחשב שאף-פעם לא באמת בדקו את התוכנות שלך באופן יסודי (ולא, לקוחות לא באמת יודעים איך לבדוק באופן יסודי). בקשר לאבטחה של מיקרוסופט, הם משקיעים הרבה מאוד כסף כדי שהקוד שלהם יהיה בטוח, אבל בקוד בסדר גודל כזה זה קשה מאוד. כמו כן, כפי ש-DNile ציין, המשתמשים לא לוקחים את אמצעי הבטיחות המתאימים. 99% מהוירוסים מצליחים להתפשט כתוצאה מ-Social Engineering בלבד. וכן, שרתים של לינוקס ואפאצ'י כן נפרצים. איך אני מסביר את זה שמיקרוסופט נפרצים יותר? הרבה יותר מנסים לפרוץ אליהם. אגב, ייתכן מאוד שהקוד של אפאצ'י טוב יותר מ-IIS (חח, ייתכן), אבל בשניהם יש באגים, ושניהם נפרצים. וכאן מגיע גם דבר אחר, והוא התכנון. את רוב הבאגים ב-IIS לא ניתן היה לנצל אם הוא לא היה רץ כחלק ממערכת ההפעלה. כך אפאצ'י פועל. מצד שני, אז IIS היה הרבה יותר איטי, והרבה פחות היו משתמשים בו. זה עניין של שיווק. אותו דבר בקשר למערכת ההפעלה עצמה - הרבה מאוד באגים היו לא נצילים אם מייקרוסופט הייתה עושה הפרדה טובה יותר בין ה-Rings וה-User/Kernel Modes, אבל אז מערכת ההפעלה הייתה רצה לאט ולא ניתן היה לשחק עליה במהירות סבירה. ואז לא היו משתמשים בה. בערך כמו שקורה ללינוקס אחרי שמאבטחים אותה.
 

OriIdan

New member
כן ויש לי סיבות להיות בטוח

אני עדיין חושב שהנסיון שלי בתוכנה מספיק כדי שיהיה לי קנה מידה. ולמי שחושב שתכנתתי רק בסביבות Embedded, לא זה לא נכון, תכנתתי בהרבה סביבות הן עם מערכת הפעלה והן בלי מערכת הפעלה עם פרוססורים של 8 ביט עד 32 ביט. התוכנות שלי עברו מספיק בדיקות ואם אתה אומר שלקוחות לא יודעים לבדוק אז לא פגשת את הלקוחות שלי שהבדיקות שלהם לא מבישות אף בודק תוכנה. נכון חלק גדול מהוירוסים מתפשטים על ידי Social engineering אבל לא כך פורצים שרתים... כן גם לינוקס ואפאצ'י נפרצים אבל פחות, פחות בהרבה. למה לדעתך מנסים לפרוץ לשרתי IIS יותר? הרי הם פחות נפוצים בעולם. אולי זה פשוט כי מאד קל לפרוץ אליהם? אני לא יודע מספיק לגבי מערכות הפעלה של מיקרוסופט אבל מהמעט שאני יודע יש בהן הפרדה בדיוק כמו בלינוקס בין User mode ל Kernel mode כך יש בכל מערכת הפעלה מרובת משימות כיום. לגבי שיווק לא הבנתי מה הכוונה שלך, אבל שיווק זה שיקול שעומד רק מאחורי IIS אפאצ'י הרי זה קוד פתוח אין שיקולים שיווקיים מאחוריו.
 

DNile

New member
הייתי מצפה,

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

OriIdan

New member
מה כוונתך מסקנות שקולות?

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

DNile

New member
אני אתן לך דוגמה...

ישבנו בחדר אוכל, ואיזה אחד צעיר, ממש מריח ריח של בקו"ם, העיר על כך שזה מוזר שיש מים בקנקנים, אבל מיץ בתרמוקנים, ושבד"כ זה הפוך. בד"כ? שאלתי אותו. כן - ב3 פעמים שאכלתי כאן והיה מיץ, 2 מהם היו עם מיץ בקנקנים, ומים בתרמוקנים.
 

OriIdan

New member
לא רואה כל קשר לעניין

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

DNile

New member
א.

אני אשמח לראות מאיפה אתה לוקח את הסטטיסטיקות שלך. ב. אני מצטער מאוד, אבל הנתונים שבידך הם מעפנים, לכל פריצה יש אופי שונה, החל מDOS, וכלה בהשתלטות על המערכת, צריך לדעת בדיוק מה החומרה של כל פרצה שמתגלית. צריך לדעת מי מגלה את הפרצות, מי מפרסם אותם, מה המטרות שעמדו מאחורי מי שניסה לפרוץ. תפרוץ משהו Open source, אתה פוגע במטרה שלך לעודד את הOpen source. תפרוץ את מיקרוסופט, הפלת את המונופול הגדול, ונתת לכל מיני אנשים שיודעים לתכנת יופי על 8051, את הרושם שמיקרוסופט פחות בטוח. חוץ מזה, מיקרוסופט גם מעודדת גורמים כלשהם לחפש אצלה פרצות, והגורמים האלה מפיקים רווח כלכלי מלעשות זאת(ע"ע חברת eEye).
 
למעלה