XSS Prevention
XSS क्या है
XSS (Cross-Site Scripting) एक आम attack है जहाँ कोई बुरा user input के ज़रिए — जैसे comment या name field — आपके page में HTML या JavaScript डाल देता है। अगर आप वो input बिना साफ़ किए print करें, तो script दूसरे visitors के browsers में चल जाती है, जो cookies चुरा सकती है या accounts hijack कर सकती है।
Attack कैसे होता है
एक comment box सोचिए। आम user लिखता है "Nice post"। Attacker लिखता है:
<script>alert('hacked')</script>
अगर आपका page यह comment सीधे print करे, browser इस script को हर देखने वाले के लिए चला देता है। यही XSS है। ख़तरा text रखने में नहीं — बिना escape किए print करने में है।
हल: output escape करें
htmlspecialchars() ख़तरनाक characters को सुरक्षित text में बदल देता है ताकि browser उन्हें चलाने के बजाय दिखाए।
<?php
$comment = "<script>alert('x')</script>";
echo htmlspecialchars($comment);
?>
<script> अब page पर हानिरहित text की तरह दिखता है — चलता नहीं। यह एक function XSS से आपका मुख्य बचाव है।
Input सुरक्षित संभालना
असली value store कीजिए; escape सिर्फ़ दिखाते समय।
<?php
$name = $_POST["name"] ?? ""; // जैसा है वैसा store
// ... database में save ...
// page पर दिखाते समय:
echo "Hello, " . htmlspecialchars($name);
?>
इस तरह असली value database में बरक़रार रहती है, और सिर्फ़ screen पर आते समय सुरक्षित बनती है — escape करने की सही जगह।
सुरक्षित output नियम
- print करते समय हर user-controlled value को
htmlspecialchars()से escape कीजिए। - URLs से आई values भी escape कीजिए:
$_GETvalues user input हैं। - quotes भी escape करने को
ENT_QUOTES:htmlspecialchars($x, ENT_QUOTES)। - raw input को चिपकाकर HTML कभी मत बनाइए।
आम गलतियाँ
- Input सीधे print करना। बिना escape
echo $_POST["name"]classic XSS छेद है। - सिर्फ़ कुछ fields escape करना। एक भी un-escaped output attack के लिए काफ़ी है।
- यह सोचना कि सिर्फ़ validation XSS रोकता है। Validation अलग है; output escape बचाव है।
- URL parameters अनदेखा करना। page पर दिखने वाली
$_GETvalues भी escape होनी चाहिए।
सारांश
- XSS un-escaped input के ज़रिए attacker की script visitors के browsers में चलाता है।
- हल है output को
htmlspecialchars()से escape करना। - असली value store कीजिए; escape सिर्फ़ दिखाते समय।
- हर user-controlled value escape कीजिए, URLs की
$_GETसमेत। - Validation और escaping दोनों चाहिए — ये अलग काम करते हैं।
आगे, आती हुई data साफ़ कीजिए form validation से, या database सुरक्षित कीजिए prepared statements से।
अक्सर पूछे जाने वाले प्रश्न (FAQ)
XSS सरल शब्दों में क्या है?
htmlspecialchars XSS कैसे रोकता है?
htmlspecialchars() < और > जैसे special characters को हानिरहित text codes में बदल देता है। तो घुसाया गया <script> चलने के बजाय plain text दिखता है। user input print करते समय हमेशा इसे इस्तेमाल कीजिए।Escape ठीक कहाँ करूँ — input या output?
htmlspecialchars() से। असली value store कीजिए; escape सिर्फ़ दिखाते समय। इससे data बरक़रार और screen पर सुरक्षित रहता है।क्या XSS रोकने को validation काफ़ी है?
htmlspecialchars() से escape कीजिए।