1. דף הבית
  2. קורסים אונליין
  3. קורס PHP אונליין
  4. משתני קלט GET, POST, REQUEST ב-PHP

משתני קלט GET, POST, REQUEST ב-PHP

בפרק זה, נלמד לעבוד עם המערכים הסופר-גלובלים GET, POST, REQUEST ולטפל בקלט שמגיע מהמשתמש. נראה יישומים מעשיים וטכניקות מתקדמות לעבודה מאובטחת ויעילה.
get, post ב-PHP

טיפול במשתני קלט ב-PHP

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

משתנים סופר גלובליים הם משתנים שמוגדרים מראש ב-PHP ונגישים בכל סקופ של הקוד (מתוך ומחוץ לפונקציות). הם מתחילים בסימן קו תחתי (_) מיד לאחר סימן ה-$ שמייצג את המשתנה.

המשתנים הסופר גלובלים הנפוצים ביותר לטיפול בקלט משתמשים הם:

GET - מערך הכולל את אוסף נתוני הקלט שהועברו כפרמטרים בכתובת האתר (ה-URL).
POST - מערך הכולל את אוסף נתוני הקלט שהועברו בגוף הבקשה בצורה נסתרת.
REQUEST - מערך הכולל את כלל נתוני הקלט שהועברו. איחוד הנתונים של GET ושל POST.

נבחן משתנים אלו להלן.

המערך GET ואיסוף נתונים מה-URL

GET מאחזר נתונים שנשלחו בשיטת HTTP GET, הנכללים בדרך כלל במחרוזת השאילתה של כתובת האתר, כלומר, הועברו כפרמטרים בכתובת האתר (ה-URL).

תכונות עיקריות של שליחת נתונים בשיטת GET:

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

נניח שיש לנו את קטע ה-HTML להלן:

<form method="get" action="process.php">
    <label for="city">City:</label>
    <input type="text" name="city" id="city">
    <button type="submit">Submit</button>
</form>

בקטע ה-HTML הזה, הגדרנו טופס (form) שכולל שדה קלט יחיד מסוג input בשם city. לפי מאפיין ה-action, מילוי הטופס יריץ קובץ PHP בשם process שיטפל בנתוני הקלט בצד השרת. הנתונים מועברים לקובץ בשיטת GET, כלומר כפרמטרים בשורת הכתובת (ה-URL) שאליה נעבור לאחר שליחת הטופס.

אם לדוגמה ימלא הלקוח את השדה city בערך Jerusalem, אז שורת הכתובת תראה כך:

https://example.com/process.php?city=Jerusalem

בקובץ process נוכל לטפל בערכים שנקלטים באופן הבא:

<?php
if (isset($_GET['city'])) {
    $city = htmlspecialchars($_GET['city']);
    echo "You searched for: $city";
} else {
    echo "Please provide a city.";
}

// Possible output:
// You searched for: London
?>

אם קיים המפתח city במערך הסופר גלובלי GET, אז תנאי ה-if מתקיים ויבוצע בלוק הקוד הראשון. אחרת, יבוצע בלוק הקוד השני (חלק ה-else). השימוש בפונקציה htmlspecialchars נועד להמיר תווים שעלולים להיות בעיתיים מסיבות אבטחתיות (כגון &, >, <, ", ') לסדרת תווים שמייצגים תווים אלו. אי טיפול בתווי הקלט היא פירצת אבטחה מסוג XSS, שלפיה גולשים יכולים במכוון להכניס קלט שכולל סקריפטים לביצוע, ומהווה סיכוני בטיחות שונים.

המערך POST ואיסוף נתונים מגוף הבקשה

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

תכונות עיקריות של שליחת נתונים בשיטת POST:

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

נניח שיש לנו את קטע ה-HTML להלן:

<form method="post" action="process.php">
    <label for="username">Username:</label>
    <input type="text" name="username" id="username">
    <label for="password">Password:</label>
    <input type="password" name="password" id="password">
    <button type="submit">Login</button>
</form>

בקטע ה-HTML הזה, הגדרנו טופס שכולל 2 שדות קלט מסוג input, הראשון בשם username והשני בשם password. גם הפעם, לפי מאפיין ה-action, מילוי הטופס יריץ קובץ PHP בשם process שיטפל בנתונים בצד השרת. שבניגוד לדוגמה הקודמת, שיטת העברת הנתונים היא POST. המשמעות היא שכתובת האתר (ה-URL) שאליה נגיע לאחר שליחת הטופס, תהיה ללא כל פרמטרים מיוחדים ולא תחשוף את הנתונים שהועברו. הערכים username ו-password יועברו בצורה מוסתרת לשרת.

בקובץ process נוכל לטפל בערכים שנקלטים באופן הבא:

<?php
if (!empty($_POST['username']) && !empty($_POST['password'])) {
    $username = htmlspecialchars($_POST['username']);
    $password = htmlspecialchars($_POST['password']);
    echo "Welcome, $username!";
} else {
    echo "Please fill in all fields.";
}

// Possible output:
// Welcome, Daniel!
?>

אם המפתחות username ו-password שניהם קיימים במערך הסופר גלובלי POST ואינם ריקים, תנאי ה-if מתקיים ויבוצע בלוק הקוד הראשון. אחרת, יבוצע בלוק הקוד השני (חלק ה-else).

המערך REQUEST

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

דוגמה:

<?php
if (isset($_REQUEST['search'])) {
    $search = htmlspecialchars($_REQUEST['search']);
    echo "Search results for: $search";
}
?>

בדוגמה זו, אם קיים המפתח search במערך REQUEST, תנאי ה-if מתקיים ובלוק הקוד יתבצע. המפתח search יהיה קיים אם הוא הועבר בשיטת GET או בשיטת POST.

 

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

המערך SERVER והמפתח REQUEST_METHOD

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

דוגמה:

<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $data = $_POST['feedback'] ?? 'No feedback provided.';
	// Same as:
	// $data = isset($_POST['feedback']) ? $_POST['feedback'] : 'No feedback provided.';
    echo "Feedback submitted: $data";
} elseif ($_SERVER['REQUEST_METHOD'] === 'GET') {
    $query = $_GET['query'] ?? 'No query provided.';
	// Same as:
	// $data = isset($_GET['query']) ? $_GET['query'] : 'No query provided.';
    echo "Query: $query";
}
?>

בדוגמה זו, אנו בודקים אם הועברו נתוני קלט באמצעות GET או POST ומדפיסים את הנתונים שהועברו. נשים לב שסימן ההשוואה הוא שוויון משולש (===) על מנת לבדוק גם את הערך וגם את הטיפוס (כדי לוודא שאכן הערך הוא מחרוזת). השימוש באופרטור ?? מבצע בדיקת קיום (כמו isset) ואם הערך אינו קיים, מועבר ערך ברירת מחדל (זהו תחליף לאופרטור טרינרי, כפי שמופיע בהערות ששילבנו בקוד).

 

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

<?php
if (isset($_POST)) {
    $data = $_POST['feedback'] ?? 'No feedback provided.';
	// Same as:
	// $data = isset($_POST['feedback']) ? $_POST['feedback'] : 'No feedback provided.';
    echo "Feedback submitted: $data";
} elseif (isset($_GET)) {
    $query = $_GET['query'] ?? 'No query provided.';
	// Same as:
	// $data = isset($_GET['query']) ? $_GET['query'] : 'No query provided.';
    echo "Query: $query";
}
?>

השוואה בין GET, POST ו-REQUEST

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

  מתי להשתמש ניראות גודל הנתונים רמת אבטחה
GET נתונים מוגבלים בכמות ושאינם רגישים מוצג ב-URL מוגבל נמוכה
POST נתונים רבים או רגישים מוסתר ללא הגבלה גבוהה
REQUEST פישוט הקידוד (שימוש לעיתים רחוקות) בהתאם לאופן שליחת הקלט בהתאם לאופן שליחת הקלט נמוכה

 

באופן כללי, נעדיף להשתמש ב-GET במקרים בהם נרצה במכוון שנתוני הקלט יוצגו כחלק מה-URL. לדוגמה, בשליחת נתונים של חיפוש באתר או של סינונים מתקדמים. במצבים אלו, ה-URL אליו מועברים בשליחת הטופס הוא URL שנוכל לקשר אליו ישירות (באמצעות קישור HTML) או לשלוח אותו לאחרים. בכל יתר המצבים, נעדיף שימוש ב-POST. אם יש ספק, נעדיף שימוש ב-POST. נמליץ שלא להשתמש ב-REQUEST בשום מקרה.

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