Bingkai Keamanan: Validasi Input | Mitigasi
Nonaktifkan pembuatan skrip XSLT untuk semua transformasi menggunakan lembar gaya yang tidak tepercaya
Judul | Detail |
---|---|
Komponen | Aplikasi Web |
Fase SDL | Bangun |
Teknologi yang Berlaku | Generik |
Atribut | T/A |
Referensi | XSLT Security, XsltSettings.EnableScript Property |
Langkah-langkah | XSLT mendukung pembuatan skrip di dalam lembar gaya menggunakan <msxml:script> elemen. Ini memungkinkan fungsi kustom digunakan dalam transformasi XSLT. Skrip dijalankan di bawah konteks proses yang melakukan transformasi. Skrip XSLT harus dinonaktifkan ketika berada di lingkungan yang tidak tepercaya untuk mencegah eksekusi kode yang tidak tepercaya. Jika menggunakan .NET: Pembuatan skrip XSLT dinonaktifkan secara default; namun, Anda harus memastikan bahwa itu belum diaktifkan secara eksplisit melalui XsltSettings.EnableScript properti. |
Contoh
XsltSettings settings = new XsltSettings();
settings.EnableScript = true; // WRONG: THIS SHOULD BE SET TO false
Contoh
Jika Anda menggunakan MSXML 6.0, pembuatan skrip XSLT dinonaktifkan secara default; namun, Anda harus memastikan bahwa itu belum diaktifkan secara eksplisit melalui properti objek XML DOM AllowXsltScript.
doc.setProperty("AllowXsltScript", true); // WRONG: THIS SHOULD BE SET TO false
Contoh
Jika Anda menggunakan MSXML 5 atau di bawahnya, pembuatan skrip XSLT diaktifkan secara default dan Anda harus secara eksplisit menonaktifkannya. Set properti objek DOM XML AllowXsltScript ke false.
doc.setProperty("AllowXsltScript", false); // CORRECT. Setting to false disables XSLT scripting.
Pastikan bahwa setiap halaman yang dapat berisi konten yang dapat dikontrol pengguna memilih keluar dari sniffing MIME otomatis
Judul | Detail |
---|---|
Komponen | Aplikasi Web |
Fase SDL | Bangun |
Teknologi yang Berlaku | Generik |
Atribut | T/A |
Referensi | Bagian Keamanan IE8 V - Perlindungan Komprehensif |
Langkah-langkah | Untuk setiap halaman yang bisa berisi konten yang dapat dikontrol pengguna, Anda harus menggunakan Header HTTP Setiap jenis file yang dikirim dari server web memiliki jenis MIMEterkait (juga disebut jenis konten) yang menjelaskan sifat konten (yaitu, gambar, teks, aplikasi, dll.) Header X-Content-Type-Options adalah header HTTP yang memungkinkan pengembang menentukan bahwa konten mereka tidak boleh diendus MIME. Header ini dirancang untuk mengurangi serangan MIME-Sniffing. Dukungan untuk header ini ditambahkan di Internet Explorer 8 (IE8) Hanya pengguna Internet Explorer 8 (IE8) yang akan mendapatkan manfaat dari X-Content-Type-Options. Versi Internet Explorer sebelumnya saat ini tidak menghormati header X-Content-Type-Options Internet Explorer 8 (dan yang lebih baru) adalah satu-satunya browser utama yang menerapkan fitur opt-out sniffing MIME. Jika dan ketika browser utama lainnya (Firefox, Safari, Chrome) menerapkan fitur serupa, rekomendasi ini akan diperbarui untuk menyertakan sintaks untuk browser tersebut juga |
Contoh
Untuk mengaktifkan header yang diperlukan secara global untuk semua halaman dalam aplikasi, Anda bisa melakukan salah satu hal berikut ini:
- Tambahkan header dalam file web.config jika aplikasi dihosting oleh Internet Information Services (IIS) 7
<system.webServer>
<httpProtocol>
<customHeaders>
<add name=""X-Content-Type-Options"" value=""nosniff""/>
</customHeaders>
</httpProtocol>
</system.webServer>
- Tambahkan header melalui Application_BeginRequest global
void Application_BeginRequest(object sender, EventArgs e)
{
this.Response.Headers[""X-Content-Type-Options""] = ""nosniff"";
}
- Terapkan modul HTTP kustom
public class XContentTypeOptionsModule : IHttpModule
{
#region IHttpModule Members
public void Dispose()
{
}
public void Init(HttpApplication context)
{
context.PreSendRequestHeaders += newEventHandler(context_PreSendRequestHeaders);
}
#endregion
void context_PreSendRequestHeaders(object sender, EventArgs e)
{
HttpApplication application = sender as HttpApplication;
if (application == null)
return;
if (application.Response.Headers[""X-Content-Type-Options ""] != null)
return;
application.Response.Headers.Add(""X-Content-Type-Options "", ""nosniff"");
}
}
- Anda hanya dapat mengaktifkan header yang diperlukan untuk halaman tertentu dengan menambahkannya ke respons individual:
this.Response.Headers[""X-Content-Type-Options""] = ""nosniff"";
Keraskan atau nonaktifkan Resolusi Entitas XML
Judul | Detail |
---|---|
Komponen | Aplikasi Web |
Fase SDL | Bangun |
Teknologi yang Berlaku | Generik |
Atribut | T/A |
Referensi | Ekspansi Entitas XML, Penolakan XML serangan dan Pertahanan Layanan, Ikhtisar Keamanan MSXML, Praktik Terbaik untuk Mengamankan Kode MSXML, Referensi Protokol NSXMLParserDelegate, Menyelesaikan Referensi Eksternal |
Langkah-langkah | Meskipun tidak digunakan secara luas, ada fitur XML yang memungkinkan parser XML memperluas entitas makro dengan nilai yang ditentukan baik di dalam dokumen itu sendiri atau dari sumber eksternal. Misalnya, dokumen mungkin menentukan entitas "nama perusahaan" dengan nilai "Microsoft," sehingga setiap kali teks "&companyname;" muncul dalam dokumen, secara otomatis diganti dengan teks Microsoft. Atau, dokumen dapat menentukan entitas "MSFTStock" yang mereferensikan layanan web eksternal untuk mengambil nilai saham Microsoft saat ini. Kemudian setiap kali "&MSFTStock;" muncul dalam dokumen, secara otomatis diganti dengan harga saham saat ini. Namun, fungsi ini dapat disalahgunakan untuk membuat kondisi denial of service (DoS). Penyerang dapat menumpuk beberapa entitas untuk membuat bom XML ekspansi eksponensial yang menghabiskan semua memori yang tersedia pada sistem. Atau, dia dapat membuat referensi eksternal yang mengalir kembali sejumlah data yang tak terbatas atau yang hanya menggantung utas. Akibatnya, semua tim harus menonaktifkan resolusi entitas XML internal dan/atau eksternal sepenuhnya jika aplikasi mereka tidak menggunakannya, atau secara manual membatasi jumlah memori dan waktu yang dapat dikonsumsi aplikasi untuk resolusi entitas jika fungsi ini benar-benar diperlukan. Jika resolusi entitas tidak diperlukan oleh aplikasi Anda, maka nonaktifkan. |
Contoh
Untuk kode .NET Framework, Anda bisa menggunakan pendekatan berikut:
XmlTextReader reader = new XmlTextReader(stream);
reader.ProhibitDtd = true;
XmlReaderSettings settings = new XmlReaderSettings();
settings.ProhibitDtd = true;
XmlReader reader = XmlReader.Create(stream, settings);
// for .NET 4
XmlReaderSettings settings = new XmlReaderSettings();
settings.DtdProcessing = DtdProcessing.Prohibit;
XmlReader reader = XmlReader.Create(stream, settings);
Perhatikan bahwa nilai default ProhibitDtd
dalam XmlReaderSettings
adalah benar, tetapi dalam XmlTextReader
adalah salah. Jika Anda menggunakan XmlReaderSettings, Anda tidak perlu mengatur ProhibitDtd ke true secara eksplisit, tetapi disarankan demi keselamatan yang Anda lakukan. Perhatikan juga bahwa kelas XmlDocument memungkinkan resolusi entitas secara default.
Contoh
Untuk menonaktifkan resolusi entitas untuk XmlDocuments, gunakan XmlDocument.Load(XmlReader)
kelebihan beban metode Muat dan atur properti yang sesuai dalam argumen XmlReader untuk menonaktifkan resolusi, seperti yang diilustrasikan dalam kode berikut:
XmlReaderSettings settings = new XmlReaderSettings();
settings.ProhibitDtd = true;
XmlReader reader = XmlReader.Create(stream, settings);
XmlDocument doc = new XmlDocument();
doc.Load(reader);
Contoh
Jika menonaktifkan resolusi entitas tidak dimungkinkan untuk aplikasi Anda, atur properti XmlReaderSettings.MaxCharactersFromEntities ke nilai yang wajar sesuai dengan kebutuhan aplikasi Anda. Ini akan membatasi dampak potensi ekspansi eksponensial serangan DoS. Kode berikut memberikan contoh pendekatan ini:
XmlReaderSettings settings = new XmlReaderSettings();
settings.ProhibitDtd = false;
settings.MaxCharactersFromEntities = 1000;
XmlReader reader = XmlReader.Create(stream, settings);
Contoh
Jika Anda perlu menyelesaikan entitas sebaris tetapi tidak perlu menyelesaikan entitas eksternal, atur XmlReaderSettings.XmlResolver ke null. Misalnya:
XmlReaderSettings settings = new XmlReaderSettings();
settings.ProhibitDtd = false;
settings.MaxCharactersFromEntities = 1000;
settings.XmlResolver = null;
XmlReader reader = XmlReader.Create(stream, settings);
Perhatikan bahwa dalam MSXML6, ProhibitDTD diatur ke true (menonaktifkan pemrosesan DTD) secara default. Untuk kode Apple OSX/iOS, ada dua parser XML yang dapat Anda gunakan: NSXMLParser dan libXML2.
Aplikasi yang menggunakan http.sys melakukan verifikasi kanonikalisasi URL
Judul | Detail |
---|---|
Komponen | Aplikasi Web |
Fase SDL | Bangun |
Teknologi yang Berlaku | Generik |
Atribut | T/A |
Referensi | T/A |
Langkah-langkah | Aplikasi apa pun yang menggunakan http.sys harus mengikuti pedoman berikut:
|
Pastikan kontrol yang sesuai tersedia saat menerima file dari pengguna
Judul | Detail |
---|---|
Komponen | Aplikasi Web |
Fase SDL | Bangun |
Teknologi yang Berlaku | Generik |
Atribut | T/A |
Referensi | Unggahan File Tidak Dibatasi, Tabel Tanda Tangan File |
Langkah-langkah | File yang diunggah mewakili risiko yang signifikan terhadap aplikasi. Langkah pertama dalam banyak serangan adalah mendapatkan beberapa kode ke sistem yang akan diserang. Maka serangan hanya perlu menemukan cara untuk mendapatkan kode dieksekusi. Menggunakan unggahan file membantu penyerang mencapai langkah pertama. Konsekuensi dari unggahan file yang tidak dibatasi dapat bervariasi, termasuk pengambilalihan sistem lengkap, sistem file atau database yang kelebihan beban, meneruskan serangan ke sistem back-end, dan defacement sederhana. Itu tergantung pada apa yang dilakukan aplikasi dengan file yang diunggah dan terutama di mana aplikasi disimpan. Validasi sisi server dari unggahan file hilang. Kontrol keamanan berikut harus diimplementasikan untuk fungsionalitas Pengunggahan File:
|
Contoh
Untuk poin terakhir mengenai validasi tanda tangan format file, lihat kelas di bawah ini untuk detailnya:
private static Dictionary<string, List<byte[]>> fileSignature = new Dictionary<string, List<byte[]>>
{
{ ".DOC", new List<byte[]> { new byte[] { 0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1 } } },
{ ".DOCX", new List<byte[]> { new byte[] { 0x50, 0x4B, 0x03, 0x04 } } },
{ ".PDF", new List<byte[]> { new byte[] { 0x25, 0x50, 0x44, 0x46 } } },
{ ".ZIP", new List<byte[]>
{
new byte[] { 0x50, 0x4B, 0x03, 0x04 },
new byte[] { 0x50, 0x4B, 0x4C, 0x49, 0x54, 0x55 },
new byte[] { 0x50, 0x4B, 0x53, 0x70, 0x58 },
new byte[] { 0x50, 0x4B, 0x05, 0x06 },
new byte[] { 0x50, 0x4B, 0x07, 0x08 },
new byte[] { 0x57, 0x69, 0x6E, 0x5A, 0x69, 0x70 }
}
},
{ ".PNG", new List<byte[]> { new byte[] { 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A } } },
{ ".JPG", new List<byte[]>
{
new byte[] { 0xFF, 0xD8, 0xFF, 0xE0 },
new byte[] { 0xFF, 0xD8, 0xFF, 0xE1 },
new byte[] { 0xFF, 0xD8, 0xFF, 0xE8 }
}
},
{ ".JPEG", new List<byte[]>
{
new byte[] { 0xFF, 0xD8, 0xFF, 0xE0 },
new byte[] { 0xFF, 0xD8, 0xFF, 0xE2 },
new byte[] { 0xFF, 0xD8, 0xFF, 0xE3 }
}
},
{ ".XLS", new List<byte[]>
{
new byte[] { 0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1 },
new byte[] { 0x09, 0x08, 0x10, 0x00, 0x00, 0x06, 0x05, 0x00 },
new byte[] { 0xFD, 0xFF, 0xFF, 0xFF }
}
},
{ ".XLSX", new List<byte[]> { new byte[] { 0x50, 0x4B, 0x03, 0x04 } } },
{ ".GIF", new List<byte[]> { new byte[] { 0x47, 0x49, 0x46, 0x38 } } }
};
public static bool IsValidFileExtension(string fileName, byte[] fileData, byte[] allowedChars)
{
if (string.IsNullOrEmpty(fileName) || fileData == null || fileData.Length == 0)
{
return false;
}
bool flag = false;
string ext = Path.GetExtension(fileName);
if (string.IsNullOrEmpty(ext))
{
return false;
}
ext = ext.ToUpperInvariant();
if (ext.Equals(".TXT") || ext.Equals(".CSV") || ext.Equals(".PRN"))
{
foreach (byte b in fileData)
{
if (b > 0x7F)
{
if (allowedChars != null)
{
if (!allowedChars.Contains(b))
{
return false;
}
}
else
{
return false;
}
}
}
return true;
}
if (!fileSignature.ContainsKey(ext))
{
return true;
}
List<byte[]> sig = fileSignature[ext];
foreach (byte[] b in sig)
{
var curFileSig = new byte[b.Length];
Array.Copy(fileData, curFileSig, b.Length);
if (curFileSig.SequenceEqual(b))
{
flag = true;
break;
}
}
return flag;
}
Pastikan parameter jenis aman digunakan di Aplikasi Web untuk akses data
Judul | Detail |
---|---|
Komponen | Aplikasi Web |
Fase SDL | Bangun |
Teknologi yang Berlaku | Generik |
Atribut | T/A |
Referensi | T/A |
Langkah-langkah | Jika Anda menggunakan pengumpulan Parameter, SQL memperlakukan input adalah sebagai nilai literal daripada sebagai kode yang dapat dieksekusi. Pengumpulan Parameter dapat digunakan untuk memberlakukan batasan jenis dan panjang pada data input. Nilai di luar rentang memicu pengecualian. Jika parameter SQL jenis aman tidak digunakan, penyerang mungkin dapat mengeksekusi serangan injeksi yang tertanam dalam input yang tidak difilter. Gunakan parameter aman jenis saat mengkueri SQL untuk menghindari kemungkinan serangan injeksi SQL yang dapat terjadi dengan input yang tidak difilter. Anda dapat menggunakan jenis parameter aman dengan prosedur yang disimpan dan dengan pernyataan SQL dinamis. Parameter diperlakukan sebagai nilai literal oleh database dan bukan sebagai kode yang dapat dieksekusi. Parameter juga diperiksa untuk jenis dan panjang. |
Contoh
Kode berikut menunjukkan cara menggunakan jenis parameter aman dengan SqlParameterCollection saat memanggil prosedur yang disimpan.
using System.Data;
using System.Data.SqlClient;
using (SqlConnection connection = new SqlConnection(connectionString))
{
DataSet userDataset = new DataSet();
SqlDataAdapter myCommand = new SqlDataAdapter("LoginStoredProcedure", connection);
myCommand.SelectCommand.CommandType = CommandType.StoredProcedure;
myCommand.SelectCommand.Parameters.Add("@au_id", SqlDbType.VarChar, 11);
myCommand.SelectCommand.Parameters["@au_id"].Value = SSN.Text;
myCommand.Fill(userDataset);
}
Dalam contoh kode sebelumnya, nilai input tidak boleh lebih panjang dari 11 karakter. Jika data tidak sesuai dengan jenis atau panjang yang ditentukan oleh parameter, kelas SqlParameter akan memberikan pengecualian.
Gunakan kelas pengikatan model terpisah atau daftar filter pengikatan untuk mencegah kerentanan penugasan massal MVC
Judul | Detail |
---|---|
Komponen | Aplikasi Web |
Fase SDL | Bangun |
Teknologi yang Berlaku | MVC5, MVC6 |
Atribut | T/A |
Referensi | Atribut Metadata, Kerentanan dan Mitigasi Keamanan Kunci Publik, Panduan Lengkap untuk Penugasan Massal di ASP.NET MVC, Memulai dengan EF menggunakan MVC |
Langkah-langkah |
|
Enkode keluaran web yang tidak tepercaya sebelum rendering
Judul | Detail |
---|---|
Komponen | Aplikasi Web |
Fase SDL | Bangun |
Teknologi yang Berlaku | Generik, Formulir Web, MVC5, MVC6 |
Atribut | T/A |
Referensi | Cara mencegah pembuatan skrip lintas situs di ASP.NET, Scripting lintas situs, XSS (Cross Site Scripting) Prevention Cheat Sheet |
Langkah-langkah | Pembuatan skrip lintas situs (umumnya disingkat XSS) adalah vektor serangan untuk layanan online atau aplikasi/komponen apa pun yang mengonsumsi input dari web. Kerentanan XSS dapat memungkinkan penyerang mengeksekusi skrip pada mesin pengguna lain melalui aplikasi web yang rentan. Skrip berbahaya dapat digunakan untuk mencuri cookie dan jika tidak mengganggu mesin korban melalui JavaScript. XSS dicegah dengan memvalidasi input pengguna, memastikannya terbentuk dengan baik dan pengodean sebelum dirender di halaman web. Validasi input dan pengodean output dapat dilakukan dengan menggunakan Pustaka Perlindungan Web. Untuk kode Terkelola (C#, VB.NET, etc.), gunakan satu atau beberapa metode pengodean yang sesuai dari Pustaka Perlindungan Web (Anti-XSS), tergantung pada konteks di mana input pengguna dimanifestasikan: |
Contoh
* Encoder.HtmlEncode
* Encoder.HtmlAttributeEncode
* Encoder.JavaScriptEncode
* Encoder.UrlEncode
* Encoder.VisualBasicScriptEncode
* Encoder.XmlEncode
* Encoder.XmlAttributeEncode
* Encoder.CssEncode
* Encoder.LdapEncode
Lakukan validasi input dan pemfilteran pada semua properti Model jenis string
Judul | Detail |
---|---|
Komponen | Aplikasi Web |
Fase SDL | Bangun |
Teknologi yang Berlaku | Generic, MVC5, MVC6 |
Atribut | T/A |
Referensi | Menambahkan Validasi, Memvalidasi Data Model dalam Aplikasi MVC, Prinsip Panduan Untuk Aplikasi MVC ASP.NET Anda |
Langkah-langkah | Semua parameter input harus divalidasi sebelum digunakan dalam aplikasi untuk memastikan bahwa aplikasi dijaga terhadap input pengguna berbahaya. Validasi nilai input menggunakan validasi ekspresi reguler di sisi server dengan strategi validasi daftar yang diizinkan. Input / parameter pengguna yang tidak disanitasi yang diteruskan ke metode dapat menyebabkan kerentanan injeksi kode. Untuk aplikasi web, titik masuk juga dapat mencakup bidang formulir, QueryStrings, cookie, header HTTP, dan parameter layanan web. Pemeriksaan validasi input berikut harus dilakukan setelah pengikatan model:
|
Sanitasi harus diterapkan pada bidang formulir yang menerima semua karakter, misalnya, editor teks kaya
Judul | Detail |
---|---|
Komponen | Aplikasi Web |
Fase SDL | Bangun |
Teknologi yang Berlaku | Generik |
Atribut | T/A |
Referensi | Enkode Input Tidak Aman, HTML Sanitizer |
Langkah-langkah | Identifikasi semua tag markup statis yang ingin Anda gunakan. Praktik umum adalah membatasi pemformatan ke elemen HTML yang aman, seperti Sebelum menulis data, lakukan HTML-enkode. Ini membuat skrip berbahaya aman dengan menyebabkannya ditangani sebagai teks, bukan sebagai kode yang dapat dieksekusi.
Halaman dalam referensi menonaktifkan validasi permintaan ASP.NET dengan mengatur HtmlSanitizer adalah perpustakaan .NET untuk membersihkan fragmen dan dokumen HTML dari konstruksi yang dapat menyebabkan serangan XSS. Ini menggunakan AngleSharp untuk mengurai, memanipulasi, dan merender HTML dan CSS. HtmlSanitizer dapat dipasang sebagai paket NuGet, dan input pengguna dapat diteruskan melalui metode sanitasi HTML atau CSS yang relevan, sebagaimana berlaku, di sisi server. Harap dicatat bahwa Sanitasi sebagai kontrol keamanan harus dianggap hanya sebagai opsi terakhir. Validasi input dan Pengodean Output dianggap kontrol keamanan yang lebih baik. |
Jangan tetapkan elemen DOM untuk sink yang tidak memiliki pengodean bawaan
Judul | Detail |
---|---|
Komponen | Aplikasi Web |
Fase SDL | Bangun |
Teknologi yang Berlaku | Generik |
Atribut | T/A |
Referensi | T/A |
Langkah-langkah | Banyak fungsi Javascript tidak melakukan pengodean secara default. Saat menetapkan input yang tidak tepercaya ke elemen DOM melalui fungsi tersebut, dapat mengakibatkan eksekusi skrip lintas situs (XSS). |
Contoh
Berikut ini adalah contoh yang tidak aman:
document.getElementByID("div1").innerHtml = value;
$("#userName").html(res.Name);
return $('<div/>').html(value)
$('body').append(resHTML);
Jangan gunakan innerHtml
; sebagai gantinya gunakan innerText
. Demikian pula, alih-alih $("#elm").html()
, gunakan $("#elm").text()
Validasi semua pengalihan dalam aplikasi ditutup atau dilakukan dengan aman
Judul | Detail |
---|---|
Komponen | Aplikasi Web |
Fase SDL | Bangun |
Teknologi yang Berlaku | Generik |
Atribut | T/A |
Referensi | Kerangka Kerja Otorisasi OAuth 2.0 - Buka Redirector |
Langkah-langkah | Desain aplikasi yang memerlukan pengalihan ke lokasi yang disediakan pengguna harus membatasi target pengalihan yang mungkin ke daftar situs atau domain "aman" yang telah ditentukan sebelumnya. Semua pengalihan dalam aplikasi harus ditutup/aman. Cara melakukan:
|
Terapkan validasi input pada semua parameter jenis string yang diterima oleh metode Pengontrol
Judul | Detail |
---|---|
Komponen | Aplikasi Web |
Fase SDL | Bangun |
Teknologi yang Berlaku | Generic, MVC5, MVC6 |
Atribut | T/A |
Referensi | Memvalidasi Data Model dalam Aplikasi MVC, Prinsip Panduan Untuk Aplikasi MVC ASP.NET Anda |
Langkah-langkah | Untuk metode yang hanya menerima jenis data primitif, dan bukan model sebagai argumen, validasi input menggunakan Ekspresi Reguler harus dilakukan. Di sini Regex.IsMatch harus digunakan dengan pola regex yang valid. Jika input tidak cocok dengan Ekspresi Reguler yang ditentukan, kontrol tidak boleh dilanjutkan lebih lanjut, dan peringatan yang memadai mengenai kegagalan validasi harus ditampilkan. |
Atur batas waktu batas atas untuk pemrosesan ekspresi reguler untuk mencegah DoS karena ekspresi reguler yang buruk
Judul | Detail |
---|---|
Komponen | Aplikasi Web |
Fase SDL | Bangun |
Teknologi yang Berlaku | Generik, Formulir Web, MVC5, MVC6 |
Atribut | T/A |
Referensi | Properti DefaultRegexMatchTimeout |
Langkah-langkah | Untuk memastikan penolakan serangan layanan terhadap ekspresi reguler yang dibuat dengan buruk, yang menyebabkan banyak backtracking, atur batas waktu default global. Jika waktu pemrosesan memakan waktu lebih lama dari batas atas yang ditentukan, itu akan melemparkan pengecualian Timeout. Jika tidak ada yang dikonfigurasi, waktu habis akan tak terbatas. |
Contoh
Misalnya, konfigurasi berikut akan melempar RegexMatchTimeoutException, jika pemrosesan memakan waktu lebih dari 5 detik:
<httpRuntime targetFramework="4.5" defaultRegexMatchTimeout="00:00:05" />
Hindari menggunakan Html.Raw dalam tampilan Razor
Judul | Detail |
---|---|
Komponen | Aplikasi Web |
Fase SDL | Bangun |
Teknologi yang Berlaku | MVC5, MVC6 |
Atribut | T/A |
Referensi | T/A |
Langkah | ASP.NET WebPages (Razor) melakukan pengodean HTML otomatis. Semua string yang dicetak oleh nugget kode tertanam (blok@) secara otomatis dienkode-HTML. Namun, ketika HtmlHelper.Raw Metode dipanggil, metode mengembalikan markup yang tidak dikodekan HTML. Jika Html.Raw() metode pembantu digunakan, ia melewati perlindungan pengodean otomatis yang disediakan Razor. |
Contoh
Berikut ini adalah contoh yang tidak aman:
<div class="form-group">
@Html.Raw(Model.AccountConfirmText)
</div>
<div class="form-group">
@Html.Raw(Model.PaymentConfirmText)
</div>
</div>
Jangan gunakan Html.Raw()
kecuali Anda perlu menampilkan markup. Metode ini tidak melakukan pengodean output secara implisit. Gunakan ASP.NET lain misalnya, @Html.DisplayFor()
Jangan gunakan kueri dinamis dalam prosedur yang disimpan
Judul | Detail |
---|---|
Komponen | Database |
Fase SDL | Bangun |
Teknologi yang Berlaku | Generik |
Atribut | T/A |
Referensi | T/A |
Langkah-langkah | Serangan injeksi SQL mengeksploitasi kerentanan dalam validasi input untuk menjalankan perintah arbitrer dalam database. Ini dapat terjadi ketika aplikasi Anda menggunakan input untuk membuat pernyataan SQL dinamis untuk mengakses database. Ini juga dapat terjadi jika kode Anda menggunakan prosedur tersimpan yang merupakan string yang dilewatkan yang berisi input pengguna mentah. Dengan menggunakan serangan injeksi SQL, penyerang dapat menjalankan perintah arbitrer dalam database. Semua pernyataan SQL (termasuk pernyataan SQL dalam prosedur yang disimpan) harus di parameter. Pernyataan SQL yang di parameter akan menerima karakter yang memiliki arti khusus untuk SQL (seperti kutipan tunggal) tanpa masalah karena sangat diketik. |
Contoh
Berikut ini adalah contoh Prosedur Tersimpan dinamis yang tidak aman:
CREATE PROCEDURE [dbo].[uspGetProductsByCriteria]
(
@productName nvarchar(200) = NULL,
@startPrice float = NULL,
@endPrice float = NULL
)
AS
BEGIN
DECLARE @sql nvarchar(max)
SELECT @sql = ' SELECT ProductID, ProductName, Description, UnitPrice, ImagePath' +
' FROM dbo.Products WHERE 1 = 1 '
PRINT @sql
IF @productName IS NOT NULL
SELECT @sql = @sql + ' AND ProductName LIKE ''%' + @productName + '%'''
IF @startPrice IS NOT NULL
SELECT @sql = @sql + ' AND UnitPrice > ''' + CONVERT(VARCHAR(10),@startPrice) + ''''
IF @endPrice IS NOT NULL
SELECT @sql = @sql + ' AND UnitPrice < ''' + CONVERT(VARCHAR(10),@endPrice) + ''''
PRINT @sql
EXEC(@sql)
END
Contoh
Berikut ini adalah prosedur tersimpan yang sama yang diterapkan dengan aman:
CREATE PROCEDURE [dbo].[uspGetProductsByCriteriaSecure]
(
@productName nvarchar(200) = NULL,
@startPrice float = NULL,
@endPrice float = NULL
)
AS
BEGIN
SELECT ProductID, ProductName, Description, UnitPrice, ImagePath
FROM dbo.Products where
(@productName IS NULL or ProductName like '%'+ @productName +'%')
AND
(@startPrice IS NULL or UnitPrice > @startPrice)
AND
(@endPrice IS NULL or UnitPrice < @endPrice)
END
Pastikan validasi model dilakukan pada metode API Web
Judul | Detail |
---|---|
Komponen | API Web |
Fase SDL | Bangun |
Teknologi yang Berlaku | MVC5, MVC6 |
Atribut | T/A |
Referensi | Validasi Model di ASP.NET API Web |
Langkah-langkah | Ketika klien mengirim data ke API web, wajib memvalidasi data sebelum melakukan pemrosesan apa pun. Misalnya ASP.NET API Web yang menerima model sebagai input, gunakan anotasi data pada model untuk menetapkan aturan validasi pada properti model. |
Contoh
Kode berikut menunjukkan hal yang sama:
using System.ComponentModel.DataAnnotations;
namespace MyApi.Models
{
public class Product
{
public int Id { get; set; }
[Required]
[RegularExpression(@"^[a-zA-Z0-9]*$", ErrorMessage="Only alphanumeric characters are allowed.")]
public string Name { get; set; }
public decimal Price { get; set; }
[Range(0, 999)]
public double Weight { get; set; }
}
}
Contoh
Dalam metode tindakan pengontrol API, validitas model harus diperiksa secara eksplisit seperti yang ditunjukkan di bawah ini:
namespace MyApi.Controllers
{
public class ProductsController : ApiController
{
public HttpResponseMessage Post(Product product)
{
if (ModelState.IsValid)
{
// Do something with the product (not shown).
return new HttpResponseMessage(HttpStatusCode.OK);
}
else
{
return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
}
}
}
}
Terapkan validasi input pada semua parameter jenis string yang diterima oleh metode API Web
Judul | Detail |
---|---|
Komponen | API Web |
Fase SDL | Bangun |
Teknologi yang Berlaku | Generik, MVC 5, MVC 6 |
Atribut | T/A |
Referensi | Memvalidasi Data Model dalam Aplikasi MVC, Prinsip Panduan Untuk Aplikasi MVC ASP.NET Anda |
Langkah-langkah | Untuk metode yang hanya menerima jenis data primitif, dan bukan model sebagai argumen, validasi input menggunakan Ekspresi Reguler harus dilakukan. Di sini Regex.IsMatch harus digunakan dengan pola regex yang valid. Jika input tidak cocok dengan Ekspresi Reguler yang ditentukan, kontrol tidak boleh dilanjutkan lebih lanjut, dan peringatan yang memadai mengenai kegagalan validasi harus ditampilkan. |
Pastikan parameter jenis aman digunakan di API Web untuk akses data
Judul | Detail |
---|---|
Komponen | API Web |
Fase SDL | Bangun |
Teknologi yang Berlaku | Generik |
Atribut | T/A |
Referensi | T/A |
Langkah-langkah | Jika Anda menggunakan pengumpulan Parameter, SQL memperlakukan input adalah sebagai nilai literal daripada sebagai kode yang dapat dieksekusi. Pengumpulan Parameter dapat digunakan untuk memberlakukan batasan jenis dan panjang pada data input. Nilai di luar rentang memicu pengecualian. Jika parameter SQL jenis aman tidak digunakan, penyerang mungkin dapat mengeksekusi serangan injeksi yang tertanam dalam input yang tidak difilter. Gunakan parameter aman jenis saat mengkueri SQL untuk menghindari kemungkinan serangan injeksi SQL yang dapat terjadi dengan input yang tidak difilter. Anda dapat menggunakan jenis parameter aman dengan prosedur yang disimpan dan dengan pernyataan SQL dinamis. Parameter diperlakukan sebagai nilai literal oleh database dan bukan sebagai kode yang dapat dieksekusi. Parameter juga diperiksa untuk jenis dan panjang. |
Contoh
Kode berikut menunjukkan cara menggunakan jenis parameter aman dengan SqlParameterCollection saat memanggil prosedur yang disimpan.
using System.Data;
using System.Data.SqlClient;
using (SqlConnection connection = new SqlConnection(connectionString))
{
DataSet userDataset = new DataSet();
SqlDataAdapter myCommand = new SqlDataAdapter("LoginStoredProcedure", connection);
myCommand.SelectCommand.CommandType = CommandType.StoredProcedure;
myCommand.SelectCommand.Parameters.Add("@au_id", SqlDbType.VarChar, 11);
myCommand.SelectCommand.Parameters["@au_id"].Value = SSN.Text;
myCommand.Fill(userDataset);
}
Dalam contoh kode sebelumnya, nilai input tidak boleh lebih panjang dari 11 karakter. Jika data tidak sesuai dengan jenis atau panjang yang ditentukan oleh parameter, kelas SqlParameter akan memberikan pengecualian.
Gunakan kueri SQL parameter untuk Azure Cosmos DB
Judul | Detail |
---|---|
Komponen | Azure Document DB |
Fase SDL | Bangun |
Teknologi yang Berlaku | Generik |
Atribut | T/A |
Referensi | Mengumumkan Parameterisasi SQL di Azure Cosmos DB |
Langkah-langkah | Meskipun Azure Cosmos DB hanya mendukung kueri baca-saja, injeksi SQL masih dimungkinkan jika kueri dibuat dengan menggabungkan dengan input pengguna. Mungkin bagi pengguna untuk mendapatkan akses ke data yang seharusnya tidak mereka akses dalam koleksi yang sama dengan membuat kueri SQL berbahaya. Gunakan kueri SQL yang di parameter jika kueri dibuat berdasarkan input pengguna. |
Validasi Input WCF melalui Pengikatan skema
Judul | Detail |
---|---|
Komponen | WCF |
Fase SDL | Bangun |
Teknologi yang Berlaku | Generik, NET Framework 3 |
Atribut | T/A |
Referensi | MSDN |
Langkah-langkah | Kurangnya validasi menyebabkan serangan injeksi jenis yang berbeda. Validasi pesan mewakili satu garis pertahanan dalam perlindungan aplikasi WCF Anda. Dengan pendekatan ini, Anda memvalidasi pesan menggunakan skema untuk melindungi operasi layanan WCF dari serangan oleh klien jahat. Validasi semua pesan yang diterima oleh klien untuk melindungi klien dari serangan oleh layanan berbahaya. Validasi pesan memungkinkan memvalidasi pesan ketika operasi mengonsumsi kontrak pesan atau kontrak data, yang tidak dapat dilakukan menggunakan validasi parameter. Validasi pesan memungkinkan Anda membuat logika validasi di dalam skema, sehingga memberikan lebih banyak fleksibilitas dan mengurangi waktu pengembangan. Skema dapat digunakan kembali di berbagai aplikasi di dalam organisasi, menciptakan standar untuk representasi data. Selain itu, validasi pesan memungkinkan Anda melindungi operasi ketika mereka mengonsumsi jenis data yang lebih kompleks yang melibatkan kontrak yang mewakili logika bisnis. Untuk melakukan validasi pesan, pertama-tama Anda membuat skema yang mewakili operasi layanan Anda dan jenis data yang digunakan oleh operasi tersebut. Anda kemudian membuat kelas .NET yang mengimplementasikan pemeriksa pesan klien kustom dan pemeriksa pesan dispatcher kustom untuk memvalidasi pesan yang dikirim/diterima ke/dari layanan. Selanjutnya, Anda menerapkan perilaku titik akhir kustom untuk mengaktifkan validasi pesan pada klien dan layanan. Akhirnya, Anda menerapkan elemen konfigurasi kustom pada kelas yang memungkinkan Anda mengekspos perilaku titik akhir kustom yang diperluas dalam file konfigurasi layanan atau klien" |
WCF- Validasi input melalui Pemeriksa Parameter
Judul | Detail |
---|---|
Komponen | WCF |
Fase SDL | Bangun |
Teknologi yang Berlaku | Generik, NET Framework 3 |
Atribut | T/A |
Referensi | MSDN |
Langkah-langkah | Validasi pesan mewakili satu garis pertahanan dalam perlindungan aplikasi WCF Anda. Anda harus memvalidasi semua parameter yang terekspos dalam operasi layanan WCF untuk melindungi layanan dari serangan oleh klien jahat. Sebaliknya, Anda juga harus memvalidasi semua nilai pengembalian yang diterima oleh klien untuk melindungi klien dari serangan oleh layanan berbahaya WCF menyediakan berbagai titik ekstensibilitas yang memungkinkan Anda menyesuaikan perilaku runtime bahasa umum WCF dengan membuat ekstensi kustom. Pemeriksa Pesan dan Pemeriksa Parameter adalah dua mekanisme ekstensibilitas yang digunakan untuk mendapatkan kontrol yang lebih besar atas data yang melewati antara klien dan layanan. Anda harus menggunakan pemeriksa parameter untuk validasi input dan menggunakan pemeriksa pesan hanya ketika Anda perlu memeriksa seluruh pesan yang mengalir masuk dan keluar dari layanan. Untuk melakukan validasi input, Anda akan membangun kelas .NET dan mengimplementasikan pemeriksa parameter kustom untuk memvalidasi parameter pada operasi di layanan Anda. Selanjutnya, Anda menerapkan perilaku titik akhir kustom untuk mengaktifkan validasi pesan pada klien dan layanan. Akhirnya, Anda menerapkan elemen konfigurasi kustom pada kelas yang memungkinkan Anda mengekspos perilaku titik akhir kustom yang diperluas dalam file konfigurasi layanan atau klien |
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk