שְׁאֵלָה:
להגן על ממשק ה- API מפני חבלה?
VladiC4T
2020-06-01 00:35:57 UTC
view on stackexchange narkive permalink

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

  {date: '2020-05-31', time: '14: 28: 05 ', text: "Hey!", אל: '<id: int>', מ: '<id: int>'}  

המשתמש בעצם שולח הודעה דרך הדפדפן וזה מתקבל בשרת רשת האינטרנט. ה מ: 'מזהה' יהיה מהמשתמש ששולח את הנתונים ואילו ה אל: 'מזהה' יהיה למשתמש שהנתונים נשלחים.

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

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

  • מה אם התוקף יחליט לטפל ב" מ: id " כך שיוכל לשלוח הודעות שרירותיות לכל אחד מכל משתמש?
  • מה אם התוקף בונה סקריפט שמסרב מיליוני הודעות על ידי ניצול השדה "ל: id"

האם יתכן ויש בעיה אבטחתית אחרת אני לא מודאג?

אנא אל תשתמש במזהים מספריים.במיוחד לא אם רצוף.אתה לא צריך לבנות מערכת שבה פשוט ניתן למנות את המשתמשים.השתמש במקום זאת במחרוזות אקראיות.אם אני משתמש 55, מי משתמש 54?אם אני משתמש ב- abfkg-4remq, סביר להניח ש- abfkg-4remr אפילו לא יהיה משתמש, ולכן כתוקף, אני לא יכול לזהות בקלות את כל מזהי המשתמש
@stefan זה רלוונטי רק אם ספירת המשתמשים מהווה איום.בהרבה תרחישים זה לא.
@vidarlo אולי זה הדמיון המוגבל שלי, אבל אני לא יכול לראות תרחישים שבהם ספירת משתמשים מבחוץ היא דבר טוב.בטח, באופן פנימי יש לך db עם כל המשתמשים וזה עשוי להיות נחוץ לשימוש, אבל חיצונית, אני טוען שזה כמעט תמיד פגם.
לא קשור לאבטחה, אבל השתמש בפורמט ISO לחותמת הזמן (או העידן).זה יחסוך הרבה כאב ראש בהמשך.כמו כן, השתמש בספרייה טובה ומלאה כדי לתפעל את הזמן הזה (למשל מסירת הזמן של פייתון יליד היא איומה (ביור), למרבה המזל יש חץ, מטוטלת, דולוריאנית)
כדי להוסיף לתגובות קודמות, סיבה נוספת לא להשתמש במזהים מספריים היא שהמספרים ב- JS הם כפולים, ולכן אינם מדויקים לערכים גדולים.
@AskarKalykov בהתחשב בכך שאתה לא עושה מתמטיקה על תעודות זהות בתוך היישום שלך, (אני לא יודע למה היית עושה זאת), סביר מאוד כי חוסר דיוק שיעלה בפועל.יהיו לך כמעט 2 ^ 53 מזהים, וזה רק המספרים השלמים החיוביים.
@Ryan1729 לא תעשו שום מתמטיקה, אבל כמעט בוודאות תרצו להעביר תעודות זהות, ותרצו להעביר תעודות זהות.זה לא יהיה כל כך נהדר אם לקוחות יתחילו לקבל 404 או 403 לבקשות לגיטימיות רק בגלל שמפתחי backend החליטו להשתמש בקיזוז עבור מזהים ודיוק של מזהים אלה כאשר הכפלות נפלו ממספרים שלמים.
@AskarKalykov 2 ^ 53 הוא מעל 9 * quadrillion *.יהיו לך יותר ממספיק תעודות זהות מובחנות לכל דבר הגיוני.אתה פשוט לא מקצה למשתמשים מזהים כלשהם מחוץ לטווח הבטוח שלם.אז אני לא בטוח למה אתה מתכוון ב"דיוק של מזהים אלה ככפול נפל מעל מספרים שלמים ".אתה מתכוון שהזוגות מדויקים יותר מהנדרש?האם אתה מודאג מכך שבאגים הנובעים מכפילות חלקיות מופיעים איכשהו?
אם היינו מדברים על צפי דיוק בודדים אז בטוח, שיש רק כ -16 מיליון תעודות זהות מקלות על הקצאתם באופן לא ברצף, ותיאורטית אתה עלול להיגמר, אבל זה לא נושא עם כפילים באופן ספציפי.
@Ryan1729 אנא הסתכל בכינור הבא כדי להבין על מה אני מדבר: https://jsfiddle.net/4ez675uf/ אם אתה עומד לקבל json מ- backend, אפילו לא היית יודע שיש בעיה.
@AskarKalykov כפי שציינתי קודם, הנקודה בה זה מתחיל להתרחש היא אחרי 9 קדריליון.ספציפית ב -9,007,199,254,740,992.ראה https://jsfiddle.net/koe3fsh1/ אז, פשוט לעולם אל תקצה למשתמש מזהה שאינו בין 0 ל 9007199254740991, ותוכל לבצע בדיקה פשוטה בצד השרת כדי לבדוק אם המזהה נמצא בטווח זה ולדחותכל דבר שמחוץ לו.(וודא שאתה מטפל נכון ב- NaNs.) אז אתה יכול להוריד כל חלק חלקי ולהשתמש בו כמזהה, מכיוון שמזהה משתמש לא אמור להיות מפתח גישה.
הצעות מחיר בודדות אינן JSON.הם מקובלים על ידי מנתחים רבים, אך זה לא חלק מהתקן.שדות תאריך / שעה (אם הם מתייחסים לאותה ישות), צריכים להיות בפורמט ISO8601 (yy-MM-ddThh: mm: ss.fffZ) כלומר קל ליצור / לנתח עם ספריות סטנדרטיות.
שמונה תשובות:
vidarlo
2020-06-01 00:41:51 UTC
view on stackexchange narkive permalink

מה אם התוקף יחליט לטפל ב- "from: id" כך שיוכל לשלוח הודעות שרירותיות לכל אחד מכל משתמש?

צור הפעלה והשתמש ב מזהה מושב כמזהה, ולא מזהה המשתמש ישירות. לְמָשָׁל. תן למשתמש לשלוח אישורים, ועם אימות מוצלח, להחזיר ידית הפעלה (קצרת מועד) שיכולה לשמש בהודעות עתידיות.

אמת כי ההפעלה קיימת ופעילה, ומפה אותה חזרה לשרת המשתמש. -צד.

מה אם התוקף יבנה סקריפט שמספק דואר זבל למיליוני הודעות על ידי ניצול שדה "to: id"?

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

נשמע מדהים.אני חושב שאסטרטגיה אחרת ביחס להגבלת מי יכול לשלוח הודעות למי לגרום למשתמש לקבל איזושהי בקשת הזמנה לפני שהוא מאפשר לשולח לשלוח הודעות בדיוק כמו ש- Skype עושה (למשל).
בטוח.או שמא יש לך מגבלה ראשונית של 1-2 הודעות עבור אנשי קשר חדשים, והגדיל אותה ככל שמשתמשים עונים זה לזה.
שקעים הם חיבור קבוע, אין צורך לזהות את השולח כל הודעה מכיוון שרק השולח יכול לשלוח על אותו חיבור בכל מקרה.לאחר אימות מזהה המשתמש, אין צורך במזהה / ידית משנה.
@dandavis זה נכון, אבל עם דפדפנים ניידים נראה כי [יתכן ויש כמה בעיות בגישה זו] (https://github.com/primus/primus/issues/350).לפיכך, צורה מסוימת של הפעלה עשויה להיות לא רעיון רע.
התוקף יכין רק 100000 חשבונות שכל אחד מהם שולח 10 הודעות בדקה.
@user253751 כך שתגביל את יצירת החשבון לפי מקור IP / טווח / מיקום / באופן כללי לסף סביר - ובאפשרותך להוסיף captcha בתהליך היצירה.אם מודל האפליקציה שלך בסדר עם זה, לחלופין (או בנוסף) חזור להשתמש בשירותי כניסה משותפים (פייסבוק) או לדרוש מספר טלפון.לשירות קטן אין צורך בהכל מההתחלה, אך ייתכן שיהיה צורך להגדיל את יכולות ההגנה שלו ככל שהפופולריות שלו תגדל.
Lukas
2020-06-01 00:52:50 UTC
view on stackexchange narkive permalink

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

Vidarlo כבר הזכיר שתי בעיות אבטחה וכיצד ניתן למנוע אותן בתשובתו.

הייתי מוסיף גם שהתוכן עצמו ("text:") עלול להכיל קוד זדוני (למשל קטעי JavaScript). ודא שקוד זה אינו מבוצע בקצה המקבל.

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

אה כן זמן.במקרה שלי זה פשוט ישמש לשכבת הממשק, שום דבר לא ממש מפואר.האם אתה מכיר במקרה בלוג / משאבים כלשהם על ניצול בזמן?מעניין אותי מכיוון שאתה מחפש לדעת כמה נושאים שיכולים להגיע מעת לעת לא מטופלים כראוי.
דבר אחד שאני חושב עליו הוא מועדי הגשה, למשל לרכש.אם שולח זדוני יכול לשנות את חותמת הזמן של ההודעה, זה יכול להיראות כאילו ההודעה נשלחה לפני המועד האחרון (אם כי לא).כפי שכתבתי, זה עשוי להיות בעיה עבורכם.
הוצא את חותמות הזמן, אינך זקוק להן לתפוס מקום בהודעות, ניתן לזייף אותן, אתה יודע מתי הן נשלחות בכל מקרה.
@dandavis הם עשויים להיות שימושיים לניתוח ביצועים של שימוש רגיל - אם אין דרך אחרת בערוץ התקשורת OP משתמשת.אבל כן, לא טוב לסמוך עליהם על שום דבר שקשור לביטחון.
Oleg V. Volkov
2020-06-01 22:57:19 UTC
view on stackexchange narkive permalink

מה אם התוקף יחליט לטפל ב- "from: id" כך שיוכל לשלוח הודעות שרירותיות לכל משתמש מכל משתמש שהוא?

אל תשתמש ב-: id ב- ה- API שלך. אתה כבר מכיר את זה מהפעלה מאומתת במקום, ויש לך אפס סיבה שהמשתמש ישלח לך את זה מלכתחילה. ואם אין מה לשדר, אין מה להתעסק.

על הערה זו, זרק גם תאריך ושעה. אתה כבר יודע מתי קיבלת הודעה ואינך זקוק למשתמש שיגיד לך את זה. תזדקק לאלה רק אם ליישום שלך + API יש מושג כלשהו של הודעות לא מקוונות / מתוזמנות / צבר.

מה אם התוקף יבנה סקריפט שמסרגל מיליוני הודעות באמצעות ניצול " to: id "field?

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

אני רואה שמנצל את היותו של WebSocket ממלכתי, אך שליחת המסר שלי צריכה להגדיר מזהה שולח כלשהו כדי שהמקלט יידע למי שייכת ההודעה הזו.על ידי היפטרות מהזהה כיצד היית מציע למסור ההודעות שלי לדעת את מקור ההודעה?
אני מניח שאצטרך להסתמך על מנהל מושב כלשהו כדי למפות את ההפעלה שנשלחה מלקוח שקע האינטרנט למשתמש במסד נתונים כלשהו (כמו רדי).
@VladiC4T התקשר לשיטת ה- API "אמת" לפני שליחת הודעות והשתמש בהפעלה זו.אתה צריך את זה בכל מקרה כדי להבין אם המשתמש רשאי בכלל להשתמש ב- API ולמי הוא רשאי לשלוח הודעה.
כדי לאשר;ה- API שלי "לאמת" יבדוק אם יש אישורים ואז ימפה מזהה אימות למשתמש.ואז, עבור כל הודעה שנשלחה מהלקוח שרת שקע האינטרנט שלי היה תופס את מזהה האימות ומצביע על המשתמש?
בסדר קיבלתי את זה.הייתי פשוט עוקב אחר חיבור לקוח שקע האינטרנט שהוקם בעבר על ידי המאמת שלי ומכאן שאני משתמש רק בהפעלה של שקע הרשת.
@VladiC4T פחות או יותר זה.
Pedro
2020-06-01 15:51:38 UTC
view on stackexchange narkive permalink

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

מה אם התוקף יחליט לטפל ב- "from: id" כך שהוא יכול לשלוח הודעות שרירותיות לכל אחד מכל משתמש?

אם אתה מייצר מזהה ייחודי (ארוך, אקראי, קשה מאוד לנחש, כמו מזהה הפעלה) לכל "חדר צ'אט" בזמן היצירה וודא שכל הצדדים שמחים להצטרף באותו חדר צ'אט, אתה יכול להשתמש בו במקום במזהי משתמשים ולשלוט באילו חדרי צ'אט כל משתמש יכול לשלוח הודעה, כדי להבטיח שאחרים לא יוכלו לשלוח תוכן לצ'אטים הפרטיים של מישהו אחר; אז ההודעות שלך מהמשתמשים X ו- Y יונפקו לחדר הצ'אט A והיישום ישלח אותן. המשתמש Z לא הורשה להיכנס ולכן היישום מסרב להעביר את ההודעה.

מה אם התוקף יבנה סקריפט שמספק דואר זבל למיליוני הודעות על ידי ניצול השדה "to: id"?

ודא שההודעות אינן יכולות להיות ממוען למזהי משתמשים ולעבוד לקושי לנחש מזהי משתמשים.

Barker1889
2020-06-01 19:36:17 UTC
view on stackexchange narkive permalink

מה אם התוקף יחליט לטפל ב- "from: id" כך שהוא יכול לשלוח הודעות שרירותיות לכל אחד מכל משתמש?

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

נניח שמשתמש 1 רוצה לשלוח הודעה למשתמש 2, פשוט יותר התהליך יהיה:

  • המשתמש 1 מקבל זוג מפתחות ציבורי / פרטי. הם (או השרת) חושפים את המפתח ה ציבורי שלהם למשתמשים אחרים.
  • משתמש 1 יוצר את תוכן ההודעה ואז מייצר עבורו חתימה באמצעות ה פרטי שלהם. מפתח חזק> (הם שומרים על הסוד הזה)
  • משתמש 1 שולח את ההודעה במנה שנראית בערך כמו
  {"חתימה": "kA7dagf4. .. ", תוכן: {תאריך: '2020-05-31', שעה: '14: 28: 05 ', טקסט:" היי! "...  
  • משתמש 2 מקבל את ההודעה ואז משתמש ב ציבורי מפתח של משתמש 1 כדי לוודא שתוכן ההודעה תואם לחתימה

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

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

זה בערך איך JSON Web Tokens עובדים - אני ממליץ לקרוא על כך למידע נוסף - https://jwt.io/introduction/

מה אם התוקף יבנה סקריפט שמספק דואר זבל של מיליוני הודעות על ידי ניצול השדה "to: id"?

כפי שהוזכר בתשובות הקודמות, שילוב של הגבלת קצב והפיכת השדות ל-: id ו- from: id לקשים לנחש.

נושא קטן: היכן יאוחסן המפתח הפרטי?אם הוא מאוחסן בשרת, הוא יכול להתחזות למשתמשים.גם אם הוא מאוחסן בדפדפן, אם אתה משתמש ב- JavaScript השרת עדיין יכול לגשת אליו.אם ניתן לסמוך על השרת אז השימוש במפתחות ציבוריים נראה מוגזם.
יכול להיות שהנחתי באופן שגוי שההודעות היו עמיתים לעמית.אם ניתן לסמוך על השרת אז הרעיונות הנ"ל לגבי שימוש במזהה הפעלה הם הדרך הפשוטה ביותר לפתור זאת.
Iain
2020-06-01 09:22:19 UTC
view on stackexchange narkive permalink

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

הוסף MAC (קוד אימות הודעה) עבור הנתונים. מצבי הצפנה מסוימים כמו GCM (Galois / Counter Mode) כוללים אחד, ואחרים נפרדים כך שתוכל להשתמש ב- HMAC עם משהו אחר. הרגו 2 ציפורים במכה אחת כביכול, או פשוט השתמשו בשתי אבנים. האם זה יגן על המשתמש מפני התקפה מצדך ב- API? עליכם לחשוב מה קורה אם גם אתם נפגעים.

ייתכן שתסתכלו על סוגים אחרים של ממשק API ותראו כיצד הם מקלים על סוגי התקפות. לדוגמא, OAuth 2 משתמש בפרמטר של מדינה וב- nonce, מ סיבות שונות. כמו בתשובה של @ vidarlo, אתה יכול להשתמש ב- nonce בשילוב עם מזהה ההפעלה.

שקעי רשת מוצפנים באופן טריוויאלי, ממש כמו https, ויש להם אפייה שלמה.אין גם צורך בהפעלה כי זה לא מחזור בקשה / הזמנה, זה חיבור מתמיד.
@dandavis אני מבין את הנקודה שלך אבל הם מוצפנים בין הלקוח לשרת, ולא לקוח למקבל הקצה, ולכן הוספתי את החלק על "הצד שלך בממשק ה- API".אתה צודק בקשר למזהה ההפעלה, שיהיה צורך רק בשלב הגדרת החיבור אבל [שקעי רשת חשופים לחטיפה באמצעות CORS] (https://www.christian-schneider.net/CrossSiteWebSocketHijacking.html), אזחלק אודות פרמיית המדינה של OAuth רלוונטי גם לשימוש במזהה הפעלה.כמשתמש אני רוצה לדעת שההודעה שלי מגיעה כראוי לקצה השני, לא רק לשרת.
הצפנת לקוח לשרת היא החלק החשוב.הצפנת הלקוח למקבל הקצה חשובה רק אם זה חשוב בפועל, ובהתאם למקרה השימוש הצפנה מקצה לקצה לעתים קרובות אינה שווה את המאמץ או מועילה.
@ConorMancone "הצפנת לקוח למקבל קצה חשובה רק אם זה באמת חשוב" - האם אתה עובד אצל סוכנות בת 3 אותיות או מפרסם?אחרת, ההצהרה שלך לא הגיונית.
@Iain מה דעתך על מערכת העברת הודעות בתוך CRM?או חבילת תוכנה עסקית?או מספר יישומים כלשהו מחוץ לתקשורת בין אדם לאדם?תמיד יש יותר מקרי שימוש מאלה שיש לך בראש, ולכן המלצה אוניברסלית כמעט לכל דבר הוא רעיון רע.ישנם מקרים רבים בהם E2E אינו שווה את הבעיה, ומקרים נוספים בהם הוא מנוגד לצרכים העסקיים
@ConorMancone מהשאלה: "האפליקציה עצמה היא אפליקציית צ'אט".E2E מבוססת היטב כתכונה * סבירה * לאפליקציות צ'אט עכשיו, אולי אפילו כסטנדרט - אפילו מסנג'ר של פייסבוק מתכנן לעבור אליו, אם בעלי המניות לא יכניסו אותו.עדיפות על צרכי העסק היא דבר טוב והאם ניתן לדון בכך האם מדובר בעדיפות גבוהה או לא, או אפילו בניגוד לצרכים העסקיים, אך זהו פורום אבטחה.
בהחלט ישנם מקרים רבים שבהם הצפנת E2E היא הכרח.אני לא טוען את זה.שוב, בניתי יישומי צ'אט לתוכנות עסקיות שבהם בהחלט לא היית רוצה הצפנת E2E.אני יכול לחשוב גם על מקרי שימוש במערכות צרכניות בלבד בהן הצפנת E2E אינה מה שהיית רוצה.הנקודה שלי היא שכמו כל הדברים באבטחה, חשוב כאן ניתוח סיכונים נכון והבנת מקרה השימוש שלך.הצפנת E2E אינה רלוונטית בכל המקרים, גם אם היא רלוונטית ברבים.
-1 מכיוון שהדבר הנושא תקף, השאלה שנשאלה בפועל הייתה על משתמש ** זדוני ** (אליס), ולא על מתווך זדוני (חוה).
@Tom "השאלה שנשאלה בפועל הייתה לגבי משתמש זדוני" לא זה לא, זו דוגמה."להגן על האפליקציה מכל תוקף" זה האמור בשאלה.אתה יכול להחזיר את ההצבעה הזו עכשיו ;-)
@Iain קראתי מחדש את השאלה ואני לא רואה שה- OP חוששת מ- MitM או מכל התקפות ** ערוץ ** אחרות.אני עדיין חושב שהדאגה שלו קשורה למבני נתונים.
@Tom איך לא ראית "להגן על האפליקציה מפני *** כל תוקף ***"?או * מה אם התוקף בונה סקריפט שמסרב מיליוני הודעות על ידי ניצול השדה "to: id"? * איך זה * רק * על מבנה הנתונים?זה לא, הגבלת קצב תהיה הפחתה רגילה לחלוטין שאינה משפיעה על מבנה הנתונים של המתקשר.
@Iain אני עדיין לא מאמין ש- MitM הוא במסגרת השאלה, אבל אתן לזה את היתרון של הספק.
@Tom מאד אדיר ממך, ואני מכבד שאתה מחזיק בדעתך.
Tom
2020-06-02 14:45:07 UTC
view on stackexchange narkive permalink

בגישתך ישנן סוגיות אבטחה רבות, שכבר צוינו כבר בתשובות אחרות.

אני רוצה לענות בעקרונות כלליים שיעזרו לך למצוא את הבעיות בעצמך.

התייחס לכל הנתונים המסופקים על ידי משתמשים כזדוניים

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

לעולם אל תקבל קלט על נתונים שכבר יש לך

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

גישה SWIFT

עברו על כל אלמנט ושאלו את עצמכם "מה יכול להשתבש?". SWIFT ( כאן או כמה מקורות אחרים) היא דרך מובנית לעשות זאת. בעיקרון, ברגע שצמצמת את הקלט לטקסט ותעודת זהות, חשוב כיצד מישהו יכול להתעלל בזה. האם הוא יכול לשלוח נתונים שגויים, מעט מדי נתונים, יותר מדי נתונים? גישה זו אמורה להנחות אותך באיומים המתוארים בתשובות אחרות, כגון ספירה, הצפה / דואר זבל, וכו ' . אם יש מאגר מסד נתונים של SQL, חשוב אם קיימות אפשרויות להזרקת SQL. חשוב גם על ביצועים ומגבלות מערכת - האם משתמש יכול לשלוח כל כך הרבה נתונים שזה מכריע את הקלט / פלט שלך, העיבוד שלך או קיבולת האחסון שלך? האם הוא יכול לחסום את ממשק ה- API למשתמשים אחרים (מה מגבלות העיבוד המקבילות שלך? כמה חיבורים אתה יכול להתמודד עם וכו ') בכמות קטנה של המאמץ המלא.

"דע את חולשות מערכת ה- backend שלך."בדרך כלל הייתי מרחיב את זה לכל המערכת.לדוגמא, משתמשים אחרים עלולים להיות פגיעים לסקריפט Script (XSS) בחזית.
Garandy
2020-06-02 23:15:48 UTC
view on stackexchange narkive permalink

כלל 0: לעולם אל תסמוך על הלקוח. אמת את כל התשומות מצד הלקוח בכל הנסיבות.

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

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

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



שאלה ותשובה זו תורגמה אוטומטית מהשפה האנגלית.התוכן המקורי זמין ב- stackexchange, ואנו מודים לו על רישיון cc by-sa 4.0 עליו הוא מופץ.
Loading...