Bagikan melalui


Bingkai Keamanan: Validasi Input | Mitigasi

Produk/Layanan Artikel
Aplikasi Web
Database
API Web
Azure Document DB
WCF

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 X-Content-Type-Options:nosniff. Untuk mematuhi persyaratan ini, Anda dapat mengatur halaman header yang diperlukan menurut halaman hanya untuk halaman yang mungkin berisi konten yang dapat dikontrol pengguna, atau Anda dapat mengaturnya secara global untuk semua halaman dalam aplikasi.

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:

  • Batasi panjang URL hingga tidak lebih dari 16.384 karakter (ASCII atau Unicode). Ini adalah panjang URL maksimum absolut berdasarkan pengaturan Default Internet Information Services (IIS) 6. Situs web harus berusaha untuk panjang yang lebih pendek dari ini jika memungkinkan
  • Gunakan kelas I/O file .NET Framework standar (seperti FileStream) karena ini akan memanfaatkan aturan kanonikalisasi di .NET FX
  • Secara eksplisit menyusun daftar izin dari nama file yang diketahui
  • Secara eksplisit menolak jenis file yang diketahui Anda tidak akan melayani UrlScan menolak: exe, kelelawar, cmd, com, htw, ida, idq, htr, idc, shtm[l], stm, printer, ini, pol, file dat
  • Tangkap pengecualian berikut:
    • System.ArgumentException (untuk nama perangkat)
    • System.NotSupportedException (untuk aliran data)
    • System.IO.FileNotFoundException (untuk nama file escaped tidak valid)
    • System.IO.DirectoryNotFoundException (untuk dirs escaped tidak valid)
  • Jangan panggil Win32 file I/O API. Pada URL yang tidak valid dengan anggun mengembalikan kesalahan 400 kepada pengguna, dan mencatat kesalahan sebenarnya.

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:

  • Pemeriksaan Ekstensi Berkas (hanya kumpulan jenis berkas yang diperbolehkan yang sahih yang harus diterima)
  • Batas ukuran file maksimal
  • File tidak boleh diunggah ke webroot; lokasi harus menjadi direktori pada kandar non-sistem
  • Konvensi penamaan harus diikuti, sedemikian rupa sehingga nama file yang diunggah memiliki keacakan, sehingga dapat mencegah timpa file
  • File harus dipindai untuk anti-virus sebelum menulis ke disk
  • Pastikan bahwa nama file dan metadata lainnya (misalnya, jalur file) divalidasi untuk karakter berbahaya
  • Tanda tangan format file harus diperiksa, untuk mencegah pengguna mengunggah file yang menyamar (misalnya, mengunggah file exe dengan mengubah ekstensi ke txt)

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
  • Kapan saya harus mencari kerentanan over-posting? - Kerentanan posting berlebihan dapat terjadi di mana pun Anda mengikat kelas model dari input pengguna. Kerangka kerja seperti MVC dapat mewakili data pengguna di kelas .NET kustom, termasuk Plain Old CLR Objects (POCOs). MVC secara otomatis mengisi kelas model ini dengan data dari permintaan, memberikan representasi yang nyaman untuk menangani input pengguna. Ketika kelas-kelas ini termasuk properti yang tidak boleh ditetapkan oleh pengguna, aplikasi dapat rentan terhadap serangan pengiriman berlebihan, yang memungkinkan kontrol pengguna atas data yang tidak pernah dimaksudkan aplikasi. Seperti pengikatan model MVC, teknologi akses database seperti pemeta objek/relasional seperti Kerangka Kerja Entitas sering juga mendukung penggunaan objek POCO untuk mewakili data database. Kelas model data ini memberikan kemudahan yang sama dalam menangani data database seperti yang dilakukan MVC dalam menangani input pengguna. Karena MVC dan database mendukung model serupa, seperti objek POCO, tampaknya mudah untuk menggunakan kembali kelas yang sama untuk kedua tujuan. Praktik ini gagal mempertahankan pemisahan kekhawatiran, dan itu adalah salah satu area umum di mana properti yang tidak diinginkan terkena pengikatan model, memungkinkan serangan pengiriman berlebihan.
  • Mengapa saya tidak boleh menggunakan kelas model database yang tidak difilter sebagai parameter untuk tindakan MVC saya? - Karena pengikatan model MVC akan mengikat apa pun di kelas tersebut. Bahkan jika data tidak muncul dalam tampilan Anda, pengguna jahat dapat mengirim permintaan HTTP dengan data ini termasuk, dan MVC akan dengan senang hati mengikatnya karena tindakan Anda mengatakan bahwa kelas database adalah bentuk data yang harus diterimanya untuk input pengguna.
  • Mengapa saya harus peduli dengan bentuk yang digunakan untuk pengikatan model? - Menggunakan ASP.NET pengikatan model MVC dengan model yang terlalu luas mengekspos aplikasi ke serangan posting berlebihan. Pengiriman berlebihan dapat memungkinkan penyerang mengubah data aplikasi di luar apa yang dimaksudkan pengembang, seperti mengesampingkan harga untuk item atau hak istimewa keamanan untuk akun. Aplikasi harus menggunakan model pengikatan khusus tindakan (atau daftar filter properti tertentu yang diizinkan) untuk memberikan kontrak eksplisit untuk input apa yang tidak tepercaya untuk memungkinkan melalui pengikatan model.
  • Apakah memiliki model pengikatan terpisah hanya menduplikasi kode? - Tidak, ini adalah masalah pemisahan kekhawatiran. Jika Anda menggunakan kembali model database dalam metode tindakan, Anda mengatakan properti apa pun (atau sub-properti) di kelas tersebut dapat diatur oleh pengguna dalam permintaan HTTP. Jika bukan itu yang Anda inginkan untuk dilakukan MVC, Anda memerlukan daftar filter atau bentuk kelas terpisah untuk menampilkan MVC data apa yang dapat berasal dari input pengguna sebagai gantinya.
  • Jika saya memiliki model pengikatan terpisah untuk input pengguna, apakah saya harus menduplikasi semua atribut anotasi data saya? - Belum tentu. Anda dapat menggunakan MetadataTypeAttribute pada kelas model database untuk menautkan ke metadata pada kelas pengikatan model. Perhatikan saja bahwa jenis yang direferensikan oleh MetadataTypeAttribute harus merupakan subkumpulan dari jenis referensi (dapat memiliki lebih sedikit properti, tetapi tidak lebih).
  • Memindahkan data bolak-balik antara model input pengguna dan model database itu membosankan. Bisakah saya menyalin semua properti menggunakan refleksi? - Ya. Satu-satunya properti yang muncul di model pengikatan adalah properti yang Anda tentukan aman untuk input pengguna. Tidak ada alasan keamanan yang mencegah penggunaan pantulan untuk menyalin semua properti yang ada kesamaan antara kedua model ini.
  • Bagaimana dengan [Bind(Exclude ="…")]. Bisakah saya menggunakannya daripada memiliki model pengikatan terpisah? - Pendekatan ini tidak disarankan. Menggunakan [Bind(Exclude ="…")] berarti bahwa setiap properti baru dapat diikat secara default. Ketika properti baru ditambahkan, ada langkah tambahan yang perlu diingat untuk menjaga hal-hal tetap aman, daripada desainnya aman secara default. Tergantung pada pengembang yang memeriksa daftar ini setiap kali properti ditambahkan berisiko.
  • Apakah [Bind(Include ="…")] berguna untuk operasi Edit? - Tidak. [Bind(Include ="…")] hanya cocok untuk operasi gaya INSERT (menambahkan data baru). Untuk operasi gaya UPDATE (merevisi data yang ada), gunakan pendekatan lain, seperti memiliki model pengikatan terpisah atau melewati daftar eksplisit properti yang diizinkan ke UpdateModel atau TryUpdateModel. Menambahkan atribut [Bind(Include ="…")] pada operasi Edit berarti MVC akan membuat instans objek dan hanya mengatur properti yang terdaftar, meninggalkan semua yang lain pada nilai defaultnya. Ketika data berlanjut, data akan sepenuhnya menggantikan entitas yang ada, mereset nilai untuk setiap properti yang dihilangkan ke defaultnya. Misalnya, jika IsAdmin dihilangkan dari atribut [Bind(Include ="…")] pada operasi Edit, setiap pengguna yang namanya diedit melalui tindakan ini akan direset ke IsAdmin = false (setiap pengguna yang diedit akan kehilangan status administrator). Jika Anda ingin mencegah pembaruan pada properti tertentu, gunakan salah satu pendekatan lain di atas. Perhatikan bahwa beberapa versi alat MVC menghasilkan kelas pengontrol dengan [Bind(Include ="…")] pada tindakan Edit dan menyiratkan bahwa menghapus properti dari daftar itu akan mencegah serangan pengiriman berlebihan. Namun, seperti yang dijelaskan di atas, pendekatan itu tidak bekerja seperti yang dimaksudkan dan sebaliknya akan mereset data apa pun di properti yang dihilangkan ke nilai defaultnya.
  • Untuk Membuat operasi, apakah ada peringatan yang menggunakan [Bind(Include ="…")] daripada model pengikatan terpisah? - Ya. Pertama pendekatan ini tidak bekerja untuk skenario Edit, mengharuskan mempertahankan dua pendekatan terpisah untuk mengurangi semua kerentanan pengiriman berlebihan. Kedua, model pengikatan terpisah memberlakukan pemisahan kekhawatiran antara bentuk yang digunakan untuk input pengguna dan bentuk yang digunakan untuk kegigihan, sesuatu yang [Bind(Include ="…")] tidak lakukan. Ketiga, perhatikan bahwa [Bind(Include ="…")] hanya dapat menangani properti tingkat atas; Anda tidak dapat mengizinkan hanya sebagian sub-properti (seperti "Details.Name") di atribut. Terakhir, dan mungkin yang paling penting, menggunakan [Bind(Include ="…")] memberikan langkah tambahan yang harus diingat setiap kali kelas digunakan untuk pengikatan model. Jika metode tindakan baru mengikat ke kelas data secara langsung dan lupa menyertakan atribut [Bind(Include ="…")], maka dapat rentan terhadap serangan pengiriman berlebihan, sehingga pendekatan [Bind(Include ="…")] agak kurang aman secara default. Jika Anda menggunakan [Bind(Include ="…")], berhati-hatilah untuk selalu ingat memberinya spasifikasi setiap kali kelas data Anda muncul sebagai parameter metode tindakan.
  • Untuk operasi Create, bagaimana dengan menempatkan atribut [Bind(Include ="…")] pada kelas model itu sendiri? Bukankah pendekatan ini menghindari kebutuhan untuk mengingat menempatkan atribut pada setiap metode tindakan? - Pendekatan ini berfungsi dalam beberapa kasus. Menggunakan [Bind(Include ="…")] pada jenis model itu sendiri (bukan pada parameter tindakan menggunakan kelas ini), memang menghindari perlunya mengingat untuk menyertakan atribut [Bind(Include ="…")] pada setiap metode tindakan. Menggunakan atribut langsung pada kelas secara efektif membuat area permukaan terpisah dari kelas ini untuk tujuan pengikatan model. Namun, pendekatan ini hanya memungkinkan satu bentuk pengikatan model per kelas model. Jika satu metode tindakan perlu memungkinkan pengikatan model bidang (misalnya, tindakan khusus administrator yang memperbarui peran pengguna) dan tindakan lain perlu mencegah pengikatan model bidang ini, pendekatan ini tidak akan bekerja. Setiap kelas hanya dapat memiliki satu bentuk pengikatan model; jika tindakan yang berbeda membutuhkan bentuk pengikatan model yang berbeda, bentuk tersebut perlu mewakili bentuk terpisah ini menggunakan kelas pengikatan model terpisah atau atribut [Bind(Include ="…")] terpisah pada metode tindakan.
  • Apa itu model pengikatan? Apakah mereka sama dengan model tampilan? - Ini adalah dua konsep terkait. Istilah model pengikatan mengacu pada kelas model yang digunakan dalam daftar parameter tindakan (bentuk yang dilewatkan dari model MVC yang mengikat ke metode tindakan). Model tampilan istilah mengacu pada kelas model yang diteruskan dari metode tindakan ke tampilan. Menggunakan model spesifik tampilan adalah pendekatan umum untuk meneruskan data dari metode tindakan ke tampilan. Seringkali, bentuk ini juga cocok untuk pengikatan model, dan model tampilan istilah dapat digunakan untuk merujuk model yang sama yang digunakan di kedua tempat. Tepatnya, prosedur ini berbicara secara khusus tentang model yang mengikat, berfokus pada bentuk yang diteruskan ke tindakan, yang penting untuk tujuan penugasan massal.

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:

  • Properti model harus dianotasikan dengan anotasi RegularExpression, untuk menerima karakter yang diizinkan dan panjang maksimum yang diizinkan
  • Metode pengontrol harus melakukan validitas ModelState

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 <b> (tebal) dan <i> (miring).

Sebelum menulis data, lakukan HTML-enkode. Ini membuat skrip berbahaya aman dengan menyebabkannya ditangani sebagai teks, bukan sebagai kode yang dapat dieksekusi.

  1. Nonaktifkan validasi permintaan ASP.NET dengan menambahkan atribut ValidateRequest="false" ke @ Halaman arahan
  2. Enkode input string dengan metode HtmlEncode
  3. Gunakan StringBuilder dan panggil metode Replace untuk secara selektif menghapus pengodean pada elemen HTML yang ingin Anda izinkan

Halaman dalam referensi menonaktifkan validasi permintaan ASP.NET dengan mengatur ValidateRequest="false". Melakukan HTML-enkode input dan secara selektif memungkinkan <b> dan <i> Sebagai alternatif, perpustakaan .NET untuk sanitasi HTML juga dapat digunakan.

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:

  • Identifikasi semua pengalihan
  • Terapkan mitigasi yang sesuai untuk setiap pengalihan. Mitigasi yang sesuai termasuk daftar yang diizinkan pengalihan atau konfirmasi pengguna. Jika situs web atau layanan dengan kerentanan pengalihan terbuka menggunakan penyedia identitas Facebook/OAuth/OpenID, penyerang dapat mencuri token masuk pengguna dan meniru pengguna tersebut. Ini adalah risiko yang melekat ketika menggunakan OAuth, yang didokumentasikan dalam RFC 6749 "The OAuth 2.0 Authorization Framework", Bagian 10.15 "Open Redirects" Demikian pula, kredensial pengguna dapat dikompromikan dengan serangan phishing tombak menggunakan pengalihan terbuka

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