Pengesahan Input dan Pengekodan Output
Laksanakan pengesahan input pada bahagian pelayan dan pengekodan output yang peka konteks untuk meneutralkan kerentanan suntikan dan XSS sebelum dieksploitasi.
Pengesahan Input dan Pengekodan Output ialah pelajaran Security+ Academy percuma di CoddyKit. Ini ialah pelajaran 1 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Security+ Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Security+ Academy merangkumi sejumlah 4 pelajaran.
Mengapa Input Berbahaya
Setiap cebisan data yang diterima oleh application dari luar — input borang pengguna, parameter URL, pengepala HTTP, badan Request API, muat naik fail — berpotensi dikawal oleh penyerang. Tanpa pengesahan, penyerang boleh menyuntik arahan SQL, skrip HTML, arahan Shell dan arahan XML/LDAP ke dalam aliran data application. Pengesahan input dan pengekodan output ialah dua kawalan teras yang meneutralkan kerentanan suntikan sebelum kerentanan itu boleh menyebabkan kemudaratan.
Apakah Itu Pengesahan Input?
Pengesahan input memastikan data yang diterima mematuhi jenis, format, panjang dan julat nilai yang dijangka sebelum application memprosesnya. Pengesahan hendaklah dilakukan pada Server — pengesahan pada Client dalam JavaScript mudah dipintas oleh penyerang yang memintas Request menggunakan alat seperti Burp Suite. Nama pengguna hendaklah hanya menerima aksara abjad angka; medan tarikh hendaklah hanya menerima format tarikh yang sah; medan e-mel hendaklah sepadan dengan sintaks RFC 5322.
# Server-side input validation examples:
# Validate username: allow only alphanumeric and underscore
# Pattern: ^[a-zA-Z0-9_]{3,20}$
# Reject: 'admin--', "' OR 1=1--", '<script>alert(1)</script>'
# Validate age: must be integer between 0 and 120
# Reject: -1, 999, 'abc', '18; DROP TABLE users'
# Validate email: match RFC 5322 pattern, max 254 chars
# Reject: 'a@b' (too short), attacker@evil.com<script>...Pengesahan Allowlist berbanding Denylist
Pengesahan Allowlist (senarai putih) menetapkan dengan tepat perkara yang IS dibenarkan dan menolak segala yang lain. Pengesahan Denylist (senarai hitam) menetapkan perkara yang NOT dibenarkan dan membenarkan segala yang lain. Pengesahan Allowlist sentiasa lebih baik kerana penyerang terus menemukan teknik baharu untuk memintas Denylist. Contohnya, Denylist suntikan SQL cuba menyekat aksara SELECT, UNION dan --, tetapi pengekodan kreatif sering memintas penapis ini. Allowlist yang hanya membenarkan digit untuk medan berangka tidak boleh dipintas.
# Allowlist (GOOD): only allow expected characters
# username_pattern = '^[a-zA-Z0-9_]{3,20}$'
# If input does not match -> reject with 400 Bad Request
# Denylist (WEAK): try to block known-bad patterns
# reject_patterns = ["'", '--', 'UNION', 'SELECT', 'DROP']
# Problem: attacker uses: SE%00LECT, UNION%0aALL, encoded chars
# Denylist is incomplete by definition -> prefer allowlistPertanyaan Berparameter Mencegah Suntikan SQL
Untuk interaksi pangkalan data, pertanyaan berparameter (pernyataan yang disediakan) ialah pertahanan muktamad terhadap suntikan SQL. Struktur pertanyaan ditakrifkan secara berasingan daripada data yang dibekalkan pengguna, jadi enjin pangkalan data tidak akan mentafsir input sebagai sintaks SQL. Walaupun pengguna memasukkan ' OR '1'='1, input itu dianggap sebagai parameter rentetan literal, bukannya SQL boleh laku. Pertanyaan berparameter tersedia dalam setiap bahasa utama dan pemacu pangkalan data.
# VULNERABLE: string concatenation (SQL injection possible)
# query = 'SELECT * FROM users WHERE name = ' + user_input
# Attack: user_input = "' OR '1'='1" -> returns ALL users
# SAFE: parameterized query
# query = 'SELECT * FROM users WHERE name = ?'
# cursor.execute(query, (user_input,))
# The ? is a placeholder; user_input is passed separately
# The DB driver handles escaping automatically
# Attack input: "' OR '1'='1" -> treated as literal stringApakah Itu Pengekodan Output?
Pengekodan output menukar aksara khas dalam data sebelum memasukkannya ke dalam konteks output (HTML, JavaScript, SQL, URL, arahan Shell). Ini memastikan data daripada satu konteks tidak ditafsirkan sebagai kod boleh laku dalam konteks yang lain. Prinsip utama ialah pengekodan berpandukan konteks: pengekodan yang digunakan mesti sepadan dengan konteks output. Pengekodan HTML, pengekodan URL, pengekodan JavaScript dan petikan argumen Shell masing-masing meneutralkan suntikan dalam konteksnya.
Pengekodan Output HTML Mencegah XSS
Apabila data yang dibekalkan pengguna dipaparkan dalam HTML, aksara khas mesti dikodkan dalam HTML untuk mencegah Skrip Rentas Tapak (XSS). Aksara < menjadi <, > menjadi >, dan & menjadi &. Jika penyerang memasukkan <script>alert('XSS')</script>, pengekodan HTML memaparkannya sebagai teks yang boleh dilihat dan bukannya melaksanakan skrip tersebut. Setiap rangka kerja web menyediakan fungsi pengekodan HTML — gunakannya secara konsisten.
# Without encoding (VULNERABLE to XSS):
# html = '<p>Hello, ' + username + '</p>'
# If username = '<script>document.cookie</script>'
# -> script executes in victim browser
# With HTML encoding (SAFE):
# html = '<p>Hello, ' + html_encode(username) + '</p>'
# html_encode('<script>...') -> '<script>...</script>'
# -> Displays as text, not executable scriptPeraturan Pengekodan Khusus Konteks
Konteks output yang berbeza memerlukan strategi pengekodan yang berbeza. Badan HTML: kodkan < > & ' ". Atribut HTML: kodkan aksara yang sama serta kuatkuasakan atribut yang dipetik. Konteks JavaScript: gunakan pengekodan JSON atau pelolosan rentetan JavaScript. Parameter URL: gunakan pengekodan peratus untuk aksara khas. Arahan Shell: elakkan sepenuhnya pembinaan arahan Shell daripada input pengguna; gunakan API bahasa dengan tatasusunan argumen dan bukannya penggabungan rentetan dengan pentafsir Shell.
# Context-aware encoding examples:
# HTML body context:
# safe_html = '<script>' (renders as text)
# URL parameter context:
# safe_url = 'search?q=hello%20world%26more'
# JavaScript string context (in JSON):
# safe_js = '{"name": "O\\u0027Reilly"}'
# Shell command (AVOID string concat - use array instead):
# UNSAFE: os.system('ping ' + user_input)
# SAFE: subprocess.run(['ping', '-c', '1', user_input])Pengesahan pada Berbilang Lapisan
Pengesahan input hendaklah berlaku pada berbilang lapisan, bukan hanya pada titik akhir API. Pengesahan pada Client meningkatkan pengalaman pengguna (maklum balas segera), tetapi tidak boleh dipercayai untuk keselamatan. Pengesahan API/pengawal ialah lapisan keselamatan utama. Pengesahan logik perkhidmatan/perniagaan menguatkuasakan peraturan domain. Kekangan pangkalan data (NOT NULL, CHECK, FOREIGN KEY) menyediakan lapisan pertahanan terakhir. Pertahanan berlapis bermaksud pemintasan satu lapisan tidak terus mengakibatkan eksploitasi.
Pengesahan Muat Naik Fail
Input muat naik fail amat berbahaya. Penyerang memuat naik Shell web (disamarkan sebagai imej), dokumen berniat jahat (makro) atau fail bersaiz terlalu besar (DoS). Pengesahan mesti merangkumi: mengesahkan jenis fail berdasarkan kandungan (bait ajaib), bukan sambungan sahaja; menguatkuasakan saiz fail maksimum; menyimpan muat naik di luar akar web; menamakan semula fail pada Server untuk menghalang laluan yang boleh dijangka; mengimbas dengan antivirus/petak pasir; dan tidak melaksanakan fail yang dimuat naik secara langsung.
# File upload validation steps:
# 1. Check Content-Type header (client-provided, not trusted alone)
# 2. Read first bytes (magic bytes):
# JPEG: FF D8 FF | PNG: 89 50 4E 47 | PDF: 25 50 44 46
# 3. Reject if magic bytes don't match expected type
# 4. Enforce max size: reject > 10MB
# 5. Strip original filename, assign random UUID filename
# 6. Store in /var/uploads/ (NOT /var/www/html/)
# 7. Serve via CDN or application route (not direct URL)Pengesahan Input dalam API
Application moden menggunakan API REST dan GraphQL secara meluas, maka badan Request JSON/XML perlu disahkan. Rangka kerja pengesahan API seperti Schema JSON mentakrifkan medan yang diperlukan, jenis data, corak rentetan dan julat nilai. Pengehadan kedalaman GraphQL menghalang pertanyaan bersarang secara mendalam daripada menyebabkan DoS. Pengehadan kadar Request menghalang penyalahgunaan automatik walaupun input individu adalah sah. Pengesahan Schema hendaklah berlaku sebelum sebarang logik perniagaan memproses Request.
# JSON Schema validation example:
# POST /api/register body schema:
# {
# 'type': 'object',
# 'required': ['username', 'email', 'password'],
# 'properties': {
# 'username': {'type': 'string', 'pattern': '^[a-zA-Z0-9_]{3,20}$'},
# 'email': {'type': 'string', 'format': 'email', 'maxLength': 254},
# 'password': {'type': 'string', 'minLength': 12, 'maxLength': 128}
# },
# 'additionalProperties': false
# }Mesej Error dan Pendedahan Maklumat
Mesej Error yang dikembalikan kepada pengguna boleh mendedahkan maklumat sensitif secara tidak sengaja, lalu membantu penyerang. Mesej Error pangkalan data mungkin mendedahkan nama jadual, jenis lajur atau sintaks SQL. Jejak tindanan mendedahkan versi rangka kerja application dan laluan fail. Error pengesahan input yang terperinci boleh mengesahkan kepada penyerang aksara yang ditolak, lalu membantu mereka merangka cubaan pemintasan. Amalan terbaik: kembalikan mesej Error umum yang mesra pengguna kepada Client (contohnya, 'Input tidak sah') sambil merekod maklumat Error terperinci pada Server untuk penyahpepijatan pembangun. Jangan dedahkan mesej pengecualian mentah kepada pengguna akhir.
# UNSAFE: returning detailed database error to user
# Error: 'You have an error in your SQL syntax near ... at line 1'
# Reveals: database type (MySQL), partial query structure
# UNSAFE: stack trace in API response
# Error: 'java.sql.SQLException at com.company.UserDAO.findByName:47'
# Reveals: framework (Java), class names, line numbers
# SAFE: generic error response to client
# HTTP 400 Bad Request: { 'error': 'Invalid request parameters' }
# Server log (internal only): full exception with stack trace
# Monitoring: alert on high error rates -> investigate internallySemakan Pantas
Uji pemahaman anda tentang konsep CompTIA Security+ (SY0-701) daripada pelajaran ini.
Imbas Kembali Pelajaran
Dalam pelajaran ini, anda telah mempelajari bahawa: pengesahan input pada Server menggunakan Allowlist memastikan hanya data yang dijangka diproses, pertanyaan berparameter mencegah suntikan SQL dengan memisahkan data daripada struktur pertanyaan, dan pengekodan output berpandukan konteks mencegah XSS serta serangan suntikan lain dengan meneutralkan aksara khas sebelum aksara tersebut memasuki konteks HTML, JavaScript, URL atau Shell. Seterusnya, kita akan meneroka pengurusan Secret yang selamat dan suntikan pemboleh ubah persekitaran.
Pelajari Security+ Academy dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 30
- Pelajaran
- 120
Soalan Lazim
Adakah pelajaran “Pengesahan Input dan Pengekodan Output” percuma?
Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Security+ Academy, termasuk “Pengesahan Input dan Pengekodan Output”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Security+ Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “Pengesahan Input dan Pengekodan Output”?
Laksanakan pengesahan input pada bahagian pelayan dan pengekodan output yang peka konteks untuk meneutralkan kerentanan suntikan dan XSS sebelum dieksploitasi. Anda berlatih Security+ Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Security+ Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Security+ Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 1 daripada 4.
Berapa lamakah pelajaran “Pengesahan Input dan Pengekodan Output” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Security+ Academy ini?
Ya. Setiap pelajaran Security+ Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Pengesahan Input dan Pengekodan Output
- Pengurusan Rahsia Selamat dan Pemboleh Ubah Persekitaran
- Keselamatan Kebergantungan dan Analisis Komposisi Perisian
- DevSecOps: Mengalihkan Keselamatan ke Awal dalam Saluran Paip