Free tutorials & notes in Hindi & English · Clean code examples 🧰 मुफ़्त PDF और फ़ोटो टूल्स →
🛡️ Days 23–27 – Professional JavaScript  ·  दिन 26

दिन 26: Security और Clean Code

⏱ 95 min📶 Pro🎯 100% self-study
दिन 26 / 30

✅ आज आप सीखेंगे

  • XSS: attackers scripts कैसे डालते हैं – और कैसे रोकें
  • सुरक्षित rendering: textContent, escaping, sanitising
  • CSP, HTTPS, cookies और third-party scripts
  • Secrets और “client पर कभी भरोसा नहीं” (prices, discounts)
  • Clean code: naming, छोटे functions, comments, एकरूपता

🏢 असली दुनिया में

छोटी Indian e-commerce sites का असली pattern: product review box reviews को innerHTML से render करता था। किसी ने ऐसा “review” डाला जिसमें script थी जो हर visitor का session token copy करती थी। दूसरी site discount JavaScript में गिनती थी – customer ने DevTools में price बदला और gift box के ₹1 दिए। दोनों front-end ग़लतियाँ आज के बाद आप कभी नहीं करेंगे।

XSS: front-end की नंबर एक कमज़ोरी

HTML + JavaScript
<p>A customer review (imagine it came from the database):</p>
<div id="unsafe" style="border:2px solid #dc2626;padding:8px;border-radius:8px"></div>
<div id="safe" style="border:2px solid #16a34a;padding:8px;border-radius:8px;margin-top:8px"></div>
<p id="alarm" style="color:#b91c1c;font-weight:700"></p>

<script>
const review = 'Tasty! <img src="x" onerror="document.querySelector(\'#alarm\').textContent=\'⚠️ Attacker code ran – it could have stolen your login!\'">';

document.querySelector('#unsafe').innerHTML = '❌ innerHTML: ' + review;       // executes the attacker’s code
document.querySelector('#safe').textContent = '✅ textContent: ' + review;     // shown as harmless text
</script>
▶  innerHTML runs injected code; textContent shows it as text
Sink (ख़तरनाक)सुरक्षित विकल्प
el.innerHTML = userTextel.textContent = userText
User data वाला template literal HTMLcreateElement + textContent, या हर value पर escape()
insertAdjacentHTML / document.writeआपके बनाए nodes append()
href = userUrl (javascript: URLs!)सिर्फ़ http(s): new URL(u).protocol जाँच
eval(), new Function(), setTimeout("string")User data के साथ कभी नहीं – functions और JSON.parse
Rich text (HTML editor content)डालने से पहले DOMPurify से sanitise

HTML strings बनानी ही हों तो escaping

JavaScript
function escapeHTML(value) {
  return String(value)
    .replaceAll('&', '&amp;')
    .replaceAll('<', '&lt;')
    .replaceAll('>', '&gt;')
    .replaceAll('"', '&quot;')
    .replaceAll("'", '&#39;');
}
// a tagged template that escapes every ${value} automatically
function html(strings, ...values) {
  return strings.reduce((out, str, i) => out + str + (i < values.length ? escapeHTML(values[i]) : ''), '');
}

const review = { name: 'Rahul <script>steal()</script>', text: 'Best "ghewar" ever & fresh' };
console.log(html`<li><b>${review.name}</b>: ${review.text}</li>`);

function safeLink(url) {
  try {
    const u = new URL(url, 'https://sharmasweets.in');
    return ['http:', 'https:'].includes(u.protocol) ? u.href : '#';
  } catch { return '#'; }
}
console.log(safeLink('https://maps.google.com/?q=Johari+Bazaar'), safeLink('javascript:alert(1)'));
<li><b>Rahul &lt;script&gt;steal()&lt;/script&gt;</b>: Best &quot;ghewar&quot; ever &amp; fresh</li> https://maps.google.com/?q=Johari+Bazaar #

Client पर कभी भरोसा नहीं

सिर्फ़ browser में ❌

  • JS से भेजा price और discount: { total: 1 }
  • Coupon validity सिर्फ़ JS में
  • Stock सिर्फ़ JS में
  • localStorage में “isAdmin: true” flag

सही design ✅

  • सिर्फ़ product ids और quantities भेजें
  • Server prices देखे, coupons लगाए, stock जाँचे
  • Customer जो देगा वह total server गिने
  • हर server request पर permissions जाँचें
🧠 हमारा practice API यही नियम मानता है

Day 20 में POST body में सिर्फ़ { id, qty } था – API ने ख़ुद prices देखे, sold-out items मना किए और delivery गिनी। Front-end validation user experience के लिए है; सच server के लिए।

Secrets, keys और tokens

चीज़क्या front-end JS में हो सकती है?क्यों
Payment gateway SECRET key❌ कभी नहींकोई भी आपका JS पढ़ सकता है (View Source, DevTools)
Database password❌ कभी नहींसिर्फ़ server पर
Payment PUBLIC/key-id (Razorpay key_id)✅ हाँPublic होने के लिए बना; secret server पर
Google Maps browser key✅ Restrictions के साथConsole में domain (HTTP referrer) से सीमित करें
Login sessionHttpOnly cookie बेहतरJS पढ़ नहीं सकता, तो XSS चुरा नहीं सकता
.env filesसिर्फ़ VITE_ prefix वाली values browser तकइन्हें public मानें

कई परतें: CSP, HTTPS और third-party scripts

HTTP header – Content Security Policy (set on the server, e.g. .htaccess)
Content-Security-Policy: default-src 'self';
  script-src 'self' https://checkout.razorpay.com;
  img-src 'self' data: https:;
  style-src 'self' https://fonts.googleapis.com;
  font-src https://fonts.gstatic.com;
  connect-src 'self' https://codingeasily.in;
  frame-ancestors 'none'

# Even if an attacker injects <script>, the browser refuses scripts not on the list.
  • सब कुछ HTTPS पर; cookies Secure, HttpOnly और SameSite=Lax/Strict के साथ।
  • हर third-party script (chat widgets, analytics, ad tags) आपका page पढ़ सकती है – सिर्फ़ भरोसेमंद जोड़ें, versions pin करें और CDN files के लिए Subresource Integrity (integrity="sha384-…") लें।
  • npm packages updated रखें: npm audit ज्ञात कमज़ोरियाँ दिखाता है।
  • अविश्वसनीय sites के target="_blank" links पर rel="noopener noreferrer"।

Clean code: अगले developer के लिए लिखें

पहले

  • function calc(a, b, c) { if (c) { return a*b - a*b*0.1 + (a*b > 1500 ? 0 : 60) } else { return a*b + (a*b>1500?0:60) } }
  • Magic numbers 0.1, 1500, 60
  • नाम कुछ नहीं बताता
  • दोहराया logic

बाद में

  • const COUPON_RATE = 0.10, FREE_DELIVERY_FROM = 1500, DELIVERY_FEE = 60;
  • const subtotal = price * qty;
  • const discounted = hasCoupon ? subtotal * (1 - COUPON_RATE) : subtotal;
  • return discounted + (discounted >= FREE_DELIVERY_FROM ? 0 : DELIVERY_FEE);
आदतउदाहरण
नाम इरादा बताएँisDeliveryFree, getProductsByCategory, MAX_CART_ITEMS
Functions एक काम करेंvalidateOrder(), calculateTotal(), renderCart() – doEverything() नहीं
Early returns / guard clausesif (!cart.length) return showEmpty();
Magic numbers नहींconst GST_RATE = 0.05
Comments “क्यों” बताएँ, “क्या” नहीं// Courier milk sweets नहीं लेता – रास्ते में ख़राब होती हैं
एक जैसी शैलीSave पर Prettier + ESLint (Day 21)
साफ़ messages वाले छोटे commits“Fix: delivery fee shown on free orders”

🏅 आज के Job Skills

✔ सुरक्षित rendering से XSS पहचानना और रोकना✔ Prices client नहीं, server पर validate और calculate✔ Secrets front-end code से बाहर; CSP, HTTPS और सुरक्षित cookies✔ साफ़, review-योग्य JavaScript लिखना

Practice tasks

🏋️ Practice – ख़ुद करें

Task 1: इस असुरक्षित render को createElement/textContent से सुरक्षित लिखें: list.innerHTML += `<li>${comment.author}: ${comment.text}</li>`।
Solution देखें
▶  Result
Task 2: अपने code के 40-line “doEverything” checkout function को named constants के साथ validate, calculate और render functions में बाँटें।
Task 3: Vite project पर npm audit चलाएँ और ठीक करने से पहले हर warning का मतलब पढ़ें।

Quick quiz

🧠 Quick Quiz – ख़ुद को जाँचें

1. User comment दिखाने का सबसे सुरक्षित तरीक़ा?
कोई HTML parsing नहीं।
2. अंतिम order total कहाँ गिना जाना चाहिए?
Client बदला जा सकता है।
3. क्या payment gateway secret key front-end JS में हो सकती है?
JS में सब public है।
4. CSP मुख्य रूप से मदद करता है…
XSS के विरुद्ध कई परतें।
5. अच्छा comment समझाता है…
Code “क्या” दिखाता है।

Interview corner

💼 Interview Corner

XSS क्या है और कैसे रोकें?

Cross-site scripting: attacker का data HTML/JS के रूप में render होकर दूसरे users के browsers में चलता है। Data को text मानें (textContent, framework escaping), HTML/attribute/URL contexts में escape करें, rich HTML sanitise करें (DOMPurify), URLs validate करें, eval से बचें, CSP और HttpOnly cookies लें।

Business नियम सिर्फ़ front end में क्यों न हों?

Client पूरी तरह user के नियंत्रण में है – code, requests और storage बदले जा सकते हैं। Prices, discounts, stock, permissions और payments server पर लागू हों; front end तेज़, दोस्ताना अनुभव के लिए सिर्फ़ उनकी नक़ल करता है।

सारांश

  • User data textContent या escaping से render; rich HTML sanitise।
  • Client पर भरोसा नहीं: prices, stock, permissions server पर।
  • Front-end code में secrets नहीं; HTTPS, CSP, HttpOnly cookies, सावधान third parties।
  • Clean code: साफ़ नाम, छोटे functions, constants, क्यों-comments, एक जैसी शैली।
➡️ आगे

Day 27: testing और interview तैयारी – automated tests लिखें और सबसे ज़्यादा पूछे JavaScript सवालों का अभ्यास करें।

अक्सर पूछे जाने वाले प्रश्न (FAQ)

क्या React मुझे XSS से बचाता है?
React default में JSX values escape करता है, जो ज़्यादातर XSS रोकता है। dangerouslySetInnerHTML, user URLs वाले href और third-party HTML में फिर भी सावधानी चाहिए।
क्या code minify या obfuscate करना security है?
नहीं – यह सिर्फ़ code पढ़ना कठिन करता है। Browser को भेजी हर चीज़ public मानें।
← JavaScript (30 Days)
🔗

Share this topic with a friend

यह topic किसी दोस्त को भेजें

Found it useful? Send it to a classmate learning the same thing.

अच्छा लगा? जो दोस्त यही सीख रहा है, उसे भेज दीजिए।

अगला topicदिन 27: Testing और Interview तैयारी आपकी प्रगति: 26 / 30 (87%) · Lesson 27 / 30 आगे बढ़ें →

यह lesson कैसा लगा?

आपकी राय से हम content और बेहतर बनाते हैं।

अपना review और सुझाव लिखें (वैकल्पिक)

Review approve होने के बाद आपका नाम और शहर इसके साथ public दिख सकते हैं। Email या phone न लिखें।

▶ CodingEasily on YouTube

Video से सीखें – आसान Hindi में

चुनी हुई video: RDBMS भाग 3 – Class XI Commerce IT

▶ Channel subscribe करें