Theory
वह Client Check जो Enough नहीं थी
Portal का registration form एक छोटा JavaScript इस्तेमाल करता है यह check करने के लिए कि submit करने से पहले email valid दिखे। एक student JavaScript disable कर देता है, या हाथ से एक request craft करता है, और garbage सीधा आपके PHP को भेज देता है।
यही वजह है एक rule iron है: client-side validation एक convenience है, server-side validation असली security है। Browser check हमेशा bypass हो सकता है; server check नहीं हो सकता। यह lesson portal को PHP के filter_var के साथ proper server-side validation देता है, और इसे JSON बोलना सिखाता है, वह format जो हर modern front-end और API इस्तेमाल करता है।
Theory
filter_var: Validate और Sanitize
PHP एक filter engine ship करता है जो filter_var($value, FILTER_...) से पहुँचा जाता है:
- FILTER_VALIDATE_EMAIL: अगर valid है तो email return करता है, या अगर नहीं है तो false
- FILTER_VALIDATE_INT, FILTER_VALIDATE_URL: numbers और URLs के लिए same idea
- FILTER_SANITIZE_...: check करने की बजाय clean करता है (unwanted characters strip करता है)
Pattern: if (filter_var($email, FILTER_VALIDATE_EMAIL)) { ... } else { echo "Invalid email"; }। चूँकि एक valid result value है और एक invalid false है, यह cleanly पढ़ता है। Filters server पर validate करने का standard, reliable तरीका हैं, fragile checks hand-write करने से बेहतर।
Practical
एक Email Validate कीजिए, फिर JSON में Answer कीजिए
<?php
$email = trim($_POST["email"] ?? "");
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
$response = ["ok" => true, "message" => "Registered: " . $email];
} else {
$response = ["ok" => false, "message" => "Invalid email"];
}
// Turn the PHP associative array into a JSON string:
header("Content-Type: application/json");
echo json_encode($response);
// -> {"ok":true,"message":"Registered: riya@x.com"}
?>
Theory
json_encode और json_decode
JSON वह है जिससे PHP JavaScript front-ends (BCA405-01) और APIs से बात करता है। दो functions इन्हें bridge करते हैं:
- json_encode($data): PHP array/object → JSON string। एक associative array एक JSON object
{}बन जाता है; एक indexed array एक JSON array[]बन जाता है - json_decode($string): JSON string → PHP। Default से आपको एक object मिलता है; second argument की तरह
truepass कीजिए (json_decode($s, true)) इसकी बजाय एक associative array पाने के लिए
तो portal अपना registration record browser को भेजने के लिए json_encode कर सकता है, और incoming JSON को process करने के लिए json_decode कर सकता है। Encode/decode pair exam का core JSON question है, assoc-array-बनाम-object mapping के साथ।
Quiz
Portal browser में JavaScript से एक email validate करता है। filter_var के साथ server-side validation अभी भी STILL क्यों required है?
- यह नहीं है; client-side JavaScript validation sufficient है
- Client-side checks bypass हो सकते हैं (disabled JS, hand-crafted requests), तो server को भी असली guard की तरह validate करना पड़ता है
- filter_var JavaScript से faster है
- Server-side validation किसी भी client-side check की ज़रूरत को replace करता है
Show the answer
Client-side checks bypass हो सकते हैं (disabled JS, hand-crafted requests), तो server को भी असली guard की तरह validate करना पड़ता है
Client-side validation एक usability convenience है: यह fast feedback देती है: पर यह USER की machine पर चलती है और हमेशा bypass हो सकती है (JavaScript disable कीजिए, या form को bypass करते हुए directly एक request भेजिए)। तो SERVER को हर input असली security boundary की तरह validate करना पड़ता है, और filter_var इसके लिए PHP का reliable tool है। Option A एक dangerous myth है जो real breaches cause करता है। Option C point miss करता है (speed security reason से irrelevant है)। Option D इसे overstate करता है: client-side checks UX के लिए अभी भी worth keeping हैं, पर ये server-side validation को NEVER replace करते। Rule: speed के लिए client पर validate कीजिए, safety के लिए server पर।
Think first
json_decode से Object या Array?
आप event data की एक incoming JSON string json_decode करते हैं और इसे $data['seats'] की तरह access करना चाहते हैं। आपको json_decode को क्या pass करना पड़ता है, और अगर आप भूल जाएँ तो क्या होता है? फिर tap कीजिए।
Show the answer
Second argument की तरह true pass कीजिए: json_decode($json, true) एक ASSOCIATIVE ARRAY return करता है, तो $data['seats'] काम करता है। अगर आप true FORGET करें, json_decode default से एक OBJECT return करता है, और आपको इसकी बजाय OBJECT syntax इस्तेमाल करना पड़ता है: $data->seats। एक object पर $data['seats'] access करना (या एक array पर $data->seats) fail होगा। तो second argument shape decide करता है: json_decode($s) एक object देता है (arrow access), json_decode($s, true) एक associative array देता है (bracket access)। वह चुनिए जो आपके बाकी code के data पढ़ने के तरीके से match करे, और consistent रहिए। यह assoc-बनाम-object choice एक frequent real-world और exam trip-up है।
Watch out
Forms, Filters, JSON Traps
Client Validation Trust करना: हमेशा filter_var से server पर re-validate कीजिए।
json_decode में true भूलना: default एक object देता है (arrow access), array नहीं (bracket access)।
filter_var एक Boolean Return करता है यह मान लेना: FILTER_VALIDATE_EMAIL VALUE (truthy) या false return करता है; === true से compare मत कीजिए।
Content-Type: application/json Set न करना: front-ends response misread कर सकते हैं।
Decoded JSON को HTML में Raw Echo करना: display से पहले अभी भी sanitize कीजिए (XSS)।
Theory
Validated Input, Shared Format: अब, Memory
Portal properly validate करता है और JSON बोलता है। पर यह अभी भी page load होने के instant भूल जाता है कि कौन logged in है: एक नए page पर click कीजिए और आप फिर से एक stranger हैं। Web default से stateless है, और इसे fix करना अगला lesson है: COOKIES और SESSIONS pages के across एक logged-in user को REMEMBER करने के लिए, plus confirmation EMAIL भेजना। यही वह है जो pages के एक set को एक actual logged-in experience में बदलता है।
Summary
Key takeaways
- Server-side validation mandatory है: client-side (JavaScript) checks bypass हो सकते हैं और सिर्फ़ एक UX convenience हैं।
- filter_var($value, FILTER_VALIDATE_EMAIL/INT/URL) validate करता है (value या false return करता है); FILTER_SANITIZE_* clean करता है।
- json_encode PHP data को एक JSON string में बदलता है; associative arrays JSON objects {} बनते हैं, indexed arrays JSON arrays [] बनते हैं।
- json_decode JSON को PHP में बदलता है: default एक object देता है (arrow access); associative array के लिए true pass कीजिए (bracket access)।
- Front-end को JSON return करते समय Content-Type: application/json set कीजिए।
- यह वही JSON है जिससे आप BCA405-01 में मिले थे, अब server-side generated और parsed।
- Memory hook: check करने के लिए filter_var, बाहर भेजने के लिए json_encode, array के लिए json_decode(...,true)।