תחי ישראל - אין לנו ארץ אחרת

תחי ישראל -אין לנו ארץ אחרת

מסננים מובנים שמספקת שפת ה-PHP

מחבר:
בתאריך:

 

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

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

הפונקציה filter_var חייבת לקבל את שני הפרמטרים הבאים:

1. המידע שהתקבל מהמשתמש
2. כיצד לטפל במידע? באמצעות קבועים שמוגדרים מראש על ידי PHP

filter_var(כיצד לטפל, קלט מהמשתמש)

 

שימוש בקבועים מסוג FILTER_VALIDATE לדחיית מידע שאינו קביל

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

$valid_email = filter_var ($email1, FILTER_VALIDATE_EMAIL);

הפונקציה תחזיר את כתובת המייל במידה והיא כתובת קבילה, או FALSE בכל מקרה אחר. לדוגמה:

$email1 = 'yossef@reshetech.co.il';
$email2 = 'reshetech1@*gmail.com';
$valid_email = filter_var ($email1, FILTER_VALIDATE_EMAIL);
 
if($valid_email){
  echo " הוא מייל קביל <i>" . $valid_email . "</i>";
} else {
  echo "המייל אינו קביל";
}

אם נבדוק באמצעות המשתנה $email1 נקבל:

הוא מייל קביל yossef@reshetech.co.il

אבל במידה וננסה מייל שאינו קביל, כדוגמת המשתנה $email2, נקבל:

המייל אינו קביל

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

$url1 = 'yossef@reshetech.co.il';
$url2 = '';
$valid_url = filter_var($url2, FILTER_VALIDATE_URL);
 
if($valid_url){
  echo " היא כתובת אינטרנט קבילה. " . $valid_url;
} else {
  echo "כתובת בלתי קבילה";
}

בקטגוריה זו, ניתן למצוא גם את FILTER_VALIDATE_INT שמוודא שהמידע מכיל מספר שלם, ואת FILTER_VALIDATE_FLOAT, שמוודא שהמידע הוא מספר מסוג שבר עשרוני, דוגמת : 123.45

 

שימוש בקבועים מסוג FILTER_SANITIZE שמשאירים את המידע הרצוי בלבד

קבועים מסוג FILTER_SANITIZE, משאירים רק את אותו חלק של המידע שבו אנו מעוניינים, ומסירים או משנים את כל השאר.

לדוגמה, הקבוע FILTER_SANITIZE_NUMBER_INT מסנן את המספר, ומשאיר רק ספרות פלוס ומינוס. לדוגמה:

$int = "1,734.56E3";
$filtered_int = filter_var ($int, FILTER_SANITIZE_NUMBER_INT);
echo $filtered_int;

ידפיס למסך:

1734563

במידה ונרצה רק מספרים עשרוניים, אנו עלולים להתפתות ולבחור בקבוע FILTER_SANITIZE_NUMBER_FLOAT , אבל זה לא יספיק, וכדי שהקבוע יעבוד הוא צריך גם דגל שיורה לו לקבל, נוסף לספרות, גם נקודה עשרונית. לצורך זה בדיוק, נוסיף את הדגל FILTER_FLAG_ALLOW_FRACTION. לדוגמה:

$str = "1,734.56E3*COM";
$filtered_int = filter_var ($str, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);
echo $filtered_int;

ידפיס למסך:

1734.563

דגל אחר מאפשר לנו להשאיר את E או e במספר כפי שמקובל בשיטת כתיבה מדעית. הדגל הזה הוא FILTER_FLAG_ALLOW_SCIENTIFIC.

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

$filtered_float = filter_var ($str, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION | FILTER_FLAG_ALLOW_SCIENTIFIC | FILTER_FLAG_ALLOW_THOUSAND);
echo $filtered_float;

שידפיס למסך:

1,734.56E3

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

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

$html_string = "<p> "<iאתמול<"</i>תאריך הפרסום: "</p>";
$filtered_string = filter_var ($html_string, FILTER_SANITIZE_STRING);
echo $filtered_string;

ידפיס את התוצאה הבאה למסך:

אתמול :תאריך הפרסום

נקי מתגיות ה- HTML.

 

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

לכל מדריכי ה-PHP

 

 

אהבתם? לא אהבתם? דרגו!

0 הצבעות, ממוצע 0 מתוך 5 כוכבים

 

 

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

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

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

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

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

הוסף תגובה חדשה

 

 

ענה על השאלה הפשוטה הבאה כתנאי להוספת תגובה:

איך אומרים בעברית אינטרנט?

 

תמונת המגיב

ערן בתאריך: 17.11.2017

אני לומד עכשיו תכנות אינטרנט,
והמדריכים שלך מעולים...

תמונת המגיב

איש בתאריך: 31.01.2019

אם הייתי יודע את זה קודם הייתי חוסך שעות של עבודה עם ביטויים רגילים, substr ועוד בשביל 'לפלטר'...