לוגו אתר Fresh          
 
 
  אפשרות תפריט  ראשי     אפשרות תפריט  צ'אט     אפשרות תפריט  מבזקים     אפשרות תפריט  צור קשר     חץ שמאלה ‎print ‎"Hello World!"; if‎ ‎not rules.‎know ‎then rules.‎read(); חץ ימינה  

לך אחורה   לובי הפורומים > מחשבים > תכנות ובניית אתרים
שמור לעצמך קישור לדף זה באתרי שמירת קישורים חברתיים
תגובה
 
כלי אשכול חפש באשכול זה



  #2  
ישן 03-07-2009, 15:17
  Sagilevi Sagilevi אינו מחובר  
 
חבר מתאריך: 07.10.04
הודעות: 1,277
בתגובה להודעה מספר 1 שנכתבה על ידי inspired-session שמתחילה ב "אבטחת משתנים שמגיעים באמצעות GET."

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

קוד PHP:
 $id = ((int)$_GET['id'] > 0) ? (int)$_GET['id'] : 1


יש אפשרות יותר מחמירה, שבה אתה בודק אם הערך הוא מספר או לא,
ואם הוא מספר, אז אם הוא חיובי או לא. כל מצב אחר - אתה עוצר את הריצה.
אתה יכול לעשות זאת באמצעות משתנה בוליאני, יציאה (exit) או exceptions.
דוגמה לבדיקה עם משתנה בוליאני (אפשר גם לממש את $msg בתור מערך שגיאות):

קוד PHP:
 $ok true;
$msg "";

if (!
is_numeric($_GET['id'])) {
  
$ok false;
  
$msg "ERROR: You must provide a number.";
} else if ((int)
$_GET['id'] < 1) {
  
$ok false;
  
$msg "ERROR: You must provide a positive number.";
}

if (
$ok) {
  
// now use (int)$_GET['id']
} else {
  echo 
$msg;



פה דיברת על קלט של מספר, והצבתו בשאילתה. יש עוד סוגים של קלטים, ועוד שימושים.
אתה צריך לחשוב מה אתה עושה עם כל קלט - מה נחשב תקין, מה לא,
איך אתה מטפל בקלט תקין ואיך לא, איך אתה דואג שקלט לא תקין לא יפגע בך.
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #7  
ישן 03-07-2009, 17:32
  Sagilevi Sagilevi אינו מחובר  
 
חבר מתאריך: 07.10.04
הודעות: 1,277
בתגובה להודעה מספר 5 שנכתבה על ידי inspired-session שמתחילה ב "תודה גם לך :) רק עכשיו ראיתי..."

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

אם למישהו יש עוד פעולות שיעזרו, תוסיפו.

1. המרה - כאשר מדובר במספר, יש כמה גישות כמו שהראתי, אבל בסופו של דבר
אתה תמיר את הקלט (אם או בלי לבדוק שזה מספר) לטיפוס של מספר ע"י (int).
כאשר זה כבר מספר, בדר"כ אין צורך לעשות יותר בדיקות תקינות.
2. קבוצת הפונקציות Ctype, שמאפשרות לך לבדוק כל מיני סוגים של קלטים,
לדוגמה: האם הקלט הוא מספר, אותיות, אותיות ומספרים ביחד וכו'.
תמיד שיש לך אפשרות להשתמש בזה, תעשה את זה (יעילות גבוהה).
3. קבוצת הפונקציות is_* שנועדו לאפשר לך לבדוק אם קיבלת את הקלט שציפית לו.
לדוגמה: is_numeric, is_string, is_array וכו'.
4. קבוצת הפונקציות Filter, שמאפשרת לך או לבדוק (Validate filters)
או "לנקות" (Sanitize filters) את הקלט.
לדוגמה: בדיקה האם קיבלת כתובת של אתר, כתובת אימייל, IP.
וגם "סינון" של הקלט בהתאם לקלט שאתה מצפה לו.
5. ביטויים רגולריים - לפעמים אין דרך אחרת לבדוק. הכי פחות יעיל.
תעדיף להשתמש במציאת חלק ממחרוזת, לדוגמה strpos, כשאפשר.
אם אתה חייב ביטויים רגולריים לצורך בדיקת תקינות, תעזר בפונקציה preg_match.
אפשר גם להחליף תבניות מסוימות באחרות, בעזרת preg_replace למשל.
6. הכנסת קלט למסד נתונים - יש כל מיני שיטות להגנה, בעיקר מפני SQL Injection.
לכל הפחות תשתמש בפונקציה של escape כמו mysql_real_escape_string.
הטכניקה הכי בטוחה שאני מכיר היא Prepared statements והיא מתאפשרת
ב-PHP בעזרת הרחבה שנקראת PDO (לא מכיר דרך אחרת).
7. הדפסת פלט למסך - אתה צריך לקודד את הקלט שאתה מדפיס.
להגנה מפני XSS בעיקר. הפונקציה המומלצת היא htmlentities.
מה שדור דיבר עליו - הפרמטר השלישי הוא קידוד הטקסט. מומלץ להשתמש בזה.
לדוגמה:
קוד PHP:
 htmlentities($htmlENT_QUOTES"UTF-8"); 

אפשר להשתמש גם ב-strip_tags להסרה של תגי HTML.

בהצלחה.

נערך לאחרונה ע"י Sagilevi בתאריך 03-07-2009 בשעה 17:49. סיבה: הוספה, תיקון שגיאות כתיב
תגובה ללא ציטוט תגובה עם ציטוט חזרה לפורום
  #9  
ישן 03-07-2009, 17:58
  Sagilevi Sagilevi אינו מחובר  
 
חבר מתאריך: 07.10.04
הודעות: 1,277
בתגובה להודעה מספר 8 שנכתבה על ידי dorM שמתחילה ב "לא כדאי להשתמש ב-..."

ציטוט:
במקור נכתב על ידי dorM
לא כדאי להשתמש ב- htmlentities, אלא htmlspecialchars.

במקרה של קידוד UTF-8, אין צורך להגדיר קידוד בפונקציה htmlspecialchars אפילו אם קיימת האופציה להגדרת קידוד.


למה לא? אם אתה רוצה לקודד רק תווים מיוחדים - תשתמש ב-htmlspecialchars.
אם אתה רוצה לקודד את כל התווים - תשתמש ב-htmlentities.
במקרה של קידוד UTF-8 יש צורך להגדיר את זה בפונקציה,
כי ברירת המחדל היא דווקא ISO-8859-1.
תקרא כאן: Character Encoding and XSS.

ציטוט:
במקור נכתב על ידי dorM
בנוגע ל- prepared statements, שכחתי להוסיף זאת כשכתבתי על האופציות להכנסת מידע בצורה בטוחה, וזה אכן אפשרי איתם, אבל קצת בזבזני מבחינת משאבים (ראו אשכול שפתחתי בעבר על PDO)


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

כלי אשכול חפש באשכול זה
חפש באשכול זה:

חיפוש מתקדם
מצבי תצוגה דרג אשכול זה
דרג אשכול זה:

מזער את תיבת המידע אפשרויות משלוח הודעות
אתה לא יכול לפתוח אשכולות חדשים
אתה לא יכול להגיב לאשכולות
אתה לא יכול לצרף קבצים
אתה לא יכול לערוך את ההודעות שלך

קוד vB פעיל
קוד [IMG] פעיל
קוד HTML כבוי
מעבר לפורום



כל הזמנים המוצגים בדף זה הם לפי איזור זמן GMT +2. השעה כעת היא 02:00

הדף נוצר ב 0.10 שניות עם 10 שאילתות

הפורום מבוסס על vBulletin, גירסא 3.0.6
כל הזכויות לתוכנת הפורומים שמורות © 2024 - 2000 לחברת Jelsoft Enterprises.
כל הזכויות שמורות ל Fresh.co.il ©

צור קשר | תקנון האתר