Web Service, SharePoint, Web Service, CMS Tips, ASP.NET, Web Service Tutorial, SharePoint Tutorial, Web Service Tutorial, Affiliate Tutorial, CMS Tutorial, ASP.NET Tutorial

DARI MASA KE MASA

Saturday, November 18, 2017

IIS Log Parser Using C# and Saved In Database


Pada posting berjudul "IIS Log Parser Using C# and Saved In Database" kali ini penulis akan memberikan sample program untuk melakukan parsing IIS Log ke dalam database SQL Server.

Fungsi IIS Log sendiri untuk mencatat lalu lintas apa saja yang terjadi di dalam web server sehingga kita dapat menganalisa utilisasi dari aplikasi maupun respond time dari aplikasi terhadap request yang diminta oleh client.

Source code asli dari sample yanga akan saya berikan diambil dari situs : https://www.codeproject.com/Articles/18749/LogParser-DataProvider-for-ADO-NET.
Pada posting ini source code tersebut telah dimodifikasi sehingga hasil parsing dapat langsung disimpan kedalam database sehingga lebih mudah untuk diolah untuk laporan analisa.

Hal yang pertama kita perlukan adalah membuat database untuk menyimpan hasil parsing IIS Log. Dibawah ini contoh script dan tampilan database yang penulis gunakan untuk menampung hasil parsing.

USE [master]
GO
CREATE DATABASE [IISLOG]
 CONTAINMENT = NONE
 ON  PRIMARY
( NAME = N'IISLOG', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\IISLOG.mdf' , SIZE = 4096KB , MAXSIZE = UNLIMITED, FILEGROWTH = 1024KB )
 LOG ON
( NAME = N'IISLOG_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\IISLOG_log.ldf' , SIZE = 9216KB , MAXSIZE = 2048GB , FILEGROWTH = 10%)
GO
ALTER DATABASE [IISLOG] SET COMPATIBILITY_LEVEL = 110
GO
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [IISLOG].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO
ALTER DATABASE [IISLOG] SET ANSI_NULL_DEFAULT OFF
GO
ALTER DATABASE [IISLOG] SET ANSI_NULLS OFF
GO
ALTER DATABASE [IISLOG] SET ANSI_PADDING OFF
GO
ALTER DATABASE [IISLOG] SET ANSI_WARNINGS OFF
GO
ALTER DATABASE [IISLOG] SET ARITHABORT OFF
GO
ALTER DATABASE [IISLOG] SET AUTO_CLOSE OFF
GO
ALTER DATABASE [IISLOG] SET AUTO_SHRINK OFF
GO
ALTER DATABASE [IISLOG] SET AUTO_UPDATE_STATISTICS ON
GO
ALTER DATABASE [IISLOG] SET CURSOR_CLOSE_ON_COMMIT OFF
GO
ALTER DATABASE [IISLOG] SET CURSOR_DEFAULT  GLOBAL
GO
ALTER DATABASE [IISLOG] SET CONCAT_NULL_YIELDS_NULL OFF
GO
ALTER DATABASE [IISLOG] SET NUMERIC_ROUNDABORT OFF
GO
ALTER DATABASE [IISLOG] SET QUOTED_IDENTIFIER OFF
GO
ALTER DATABASE [IISLOG] SET RECURSIVE_TRIGGERS OFF
GO
ALTER DATABASE [IISLOG] SET  DISABLE_BROKER
GO
ALTER DATABASE [IISLOG] SET AUTO_UPDATE_STATISTICS_ASYNC OFF
GO
ALTER DATABASE [IISLOG] SET DATE_CORRELATION_OPTIMIZATION OFF
GO
ALTER DATABASE [IISLOG] SET TRUSTWORTHY OFF
GO
ALTER DATABASE [IISLOG] SET ALLOW_SNAPSHOT_ISOLATION OFF
GO
ALTER DATABASE [IISLOG] SET PARAMETERIZATION SIMPLE
GO
ALTER DATABASE [IISLOG] SET READ_COMMITTED_SNAPSHOT OFF
GO
ALTER DATABASE [IISLOG] SET HONOR_BROKER_PRIORITY OFF
GO
ALTER DATABASE [IISLOG] SET RECOVERY FULL
GO
ALTER DATABASE [IISLOG] SET  MULTI_USER
GO
ALTER DATABASE [IISLOG] SET PAGE_VERIFY CHECKSUM 
GO
ALTER DATABASE [IISLOG] SET DB_CHAINING OFF
GO
ALTER DATABASE [IISLOG] SET FILESTREAM( NON_TRANSACTED_ACCESS = OFF )
GO
ALTER DATABASE [IISLOG] SET TARGET_RECOVERY_TIME = 0 SECONDS
GO
EXEC sys.sp_db_vardecimal_storage_format N'IISLOG', N'ON'
GO
USE [IISLOG]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[IISLog](
    [LogFilename] [varchar](255) NOT NULL,
    [RowNumber] [int] NOT NULL,
    [EntryDate] [date] NULL,
    [EntryTime] [datetime] NOT NULL,
    [ServerName] [varchar](255) NOT NULL,
    [ServerIpAddress] [varchar](255) NOT NULL,
    [Method] [varchar](255) NOT NULL,
    [Uri] [varchar](255) NOT NULL,
    [UriQuery] [varchar](255) NULL,
    [Port] [int] NOT NULL,
    [Username] [varchar](255) NULL,
    [ClientIpAddress] [varchar](255) NOT NULL,
    [UserAgent] [varchar](255) NOT NULL,
    [Cookie] [varchar](255) NULL,
    [Hostname] [varchar](255) NOT NULL,
    [HttpStatus] [int] NOT NULL,
    [BytesFromServerToClient] [int] NOT NULL,
    [BytesFromClientToServer] [int] NOT NULL,
    [TimeTaken] [int] NOT NULL,
    [LoadDate] [datetime] NULL
) ON [PRIMARY]
GO

CREATE CLUSTERED INDEX [ClusteredIndex-RowNumber-LoadDate] ON [dbo].[IISLog]
(
    [RowNumber] ASC,
    [LoadDate] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
USE [master]
GO
ALTER DATABASE [IISLOG] SET  READ_WRITE
GO

Hasil dari parsing yang telah tersimpan di dalam database akan terlihat seperti gambar berikut ini :

IIS Log Parser Using C# and Saved In Database


Sample code IIS Log Parsing dapat diunduh pada link download berikut ini.

Semoga posting tentang "IIS Log Parser Using C# and Saved In Database" diatas dapat bermanfaat.



Salam,

Monday, November 6, 2017

Passing Value From User Control To Parent Page in ASP.NET


Sesuai dengan judul postingan yaitu "Passing Value From User Control To Parent Page in ASP.NET". Sebenarnya cara paling mudah menggunakan session yang dibuat pada user control tetapi cara ini tidak direkomendasikan karena session memiliki timeout dan mengambil banyak resource.

Sedangkan cara lainnya adalah membuat property dan mengeset property tersebut dengan memanfaatkan viewstate seperti pada contoh dibawah ini  :

Partial Class Controls_ADUserControl
    Inherits System.Web.UI.UserControl

    Public _ADUser As String

    Public Property ADUser() As String
        Get
            Return Convert.ToString(ViewState("ADAccount"))
        End Get
        Set(value As String)
            ViewState("ADAccount") = value
        End Set
    End Property

    Protected Sub BtnSearchAD_Click(sender As Object, e As System.EventArgs) Handles BtnSearchAD.Click

        ADUser = "Return Value"
    End Sub
End Class

Kemudian di parent page kita hanya perlu memanggil nama property dari user control tersebut seperti dibawah ini :


TxProjectOwner.Text = UCAD.ADUser

Maka di TxProjectOwner yang berada pada parent page akan terisi dengan "Return Value"
Semoga posting tentang "Passing Value From User Control To Parent Page in ASP.NET" diatas dapat bermanfaat.



Salam,

Thursday, November 2, 2017

The connection to the server was reset while the page was loading.


Sebagai developer web khususnya yang menggunakan ASP.NET. Pernahkah pembaca mendapatkan error seperti berikut ini "The connection to the server was reset while the page was loading" yang terjadi setelah request postback ke server yang membutuhkan waktu yang cukup lama.



The connection to the server was reset while the page was loading.


Penyebab dari error diatas adalah proses di server membutuhkan waktu yang lama atau jumlah data yang ditampilkan melewati batasan default aplikasi web.

Solusinya adalah dengan menambahkan konfigurasi di web config tag dibawah ini :

 <httpRuntime maxRequestLength="1048576" executionTimeout="800" />

Letakkan tag diatas di dalam tag <system.web></system.web>


Semoga posting tentang "The connection to the server was reset while the page was loading" diatas dapat bermanfaat.


Salam,

Tuesday, October 31, 2017

Less Than Equal For Date Data Type In SQL Server


Bertemu lagi dengan penulis yang akan membahas tentang LESS THAN EQUAL TO dan GREATER THAN EQUAL TO yang digunakan untuk tipe data tanggal pada SQL Server.

Penggunaan operator BETWEEN di query sql server akan memberikan hasil nilai yang berada diantara rentang BETWEEN tersebut. Sedangkan penggunaan LESS THAN EQUAL TO (dengan operator <=) atau GREATER THAN EQUAL TO  (dengan operator >=) akan memberikan hasil nilai yang dimulai dari rentang awal, nilai diantara rentang, dan nilai rentang akhir.

Penggunaan LESS THAN EQUAL TO dan GREATER THAN EQUAL TO memang mudah penggunaanya terutama untuk data numeric. Tapi bagaimana untuk tipe data tanggal?

Di posting sebelumnya penulis pernah membahasa tentang "Date Between Not Working In SQL Server" yang menjadi acuan pada penulisan artikel kali ini.

Penggunaan LESS THAN EQUAL TO dan GREATER THAN EQUAL TO untuk tipe data tanggal dapat memanfaat fungsi convert terlebih dahulu dikombinasikan dengan operator <= dan >= seperti terlihat pada skrip dibawah ini :

SELECT * FROM TABLE_NAME WHERE CONVERT(Date, GETDATE()) >= CONVERT(Date, StartDate) AND  CONVERT(Date, GETDATE()) <= CONVERT(Date, EndDate))


Semoga posting tentang "Less Than Equal For Date Data Type In SQL Server" diatas dapat bermanfaat.


Salam,

Monday, October 30, 2017

SQL Server Data Encryption


SQL Server 2005 dan SQL Server 2008 menyediakan fitur eknripsi untuk melindungi data dari serangan hacker.

Hacker mungkin mampu untuk melakukan akses ke database maupun table, tetapi dengan memberi enkripsi mereka tidak akan memahami data dan menggunakannya. Saat ini sudah menjadi hal yang krusial untuk melakukan enkripsi data yang disimpan didalam database sama seperti keamanan pada saat transmisi data melalui jaringan antara client dan server.

Hirarki enkripsi dibedakan dalam 3 level sekuritu. Level-level tersebut menyediakan mekanisme yang  berbeda pada saat melindungi data melalui jaringan maupub server lokal. Hirarki level yang berbeda memperbolehkan lebih dari 1 instan server untuk berjalan dalam 1 server.

Windows Level – Highest Level – Menggunakan Windows DP API untuk enkripsi
SQL Server Level – Moderate Level – Menggunakan Services Master Key untuk enkripsi
Database Level – Lower Level – Menggunakan Database Master Key untuk enkripsi


Terdapat dua jenis kunci yang digunakan dalam enkripsi:

Symmetric Key – Dalam cryptography symmetric, pengirim dan penerima pesan berbagi sebuah kunci yang sama yang digunakan untuk melakukan enkrip dan dekrip pesan. Hal ini relatif lebih mudah untuk diimplementasikan dan pengirimin maupun penerima keduanya dapat melakukan enkrip dan dekrip pesan.

Asymmetric Key – Asymmetric cryptography, sering disebut sebagai Public-key cryptography, adalah sebuag sistem dimana pengirim dan penerima pesan mempunya pasangan kunci yaitu sebuah public key dan sebuah private key – yang digunakan untuk melakukan enkrip dan dekrip pesan.
Sistem ini relatif lebih rumit dimana pengirim hanya dapat melakukan enkrip tetapi tidak dapat melakukan dekrip.
Sedangkan penerima disisi lain dapat menggunakan kuncinya untuk melakukan dekrip tetapi tidak dapat melakukan enkrip. This intricacy has turned it into a resource-intensive process.

Cara lain untuk melakukan enkripsi data adalah melalui certificates. Sertifikat kunci public adalah sebuah signed statement digital yang berisi sebuah public key untuk mengidentifikasi pengguna, device, atau service yang berkaitan dengan private key yang cocok.


Database Level – This level secures all the data in a database. However, every time data is written or read from database, the whole database needs to be decrypted. This is a very resource-intensive process and not a practical solution.
Column (or Row) Level – This level of encryption is the most preferred method. Here, only columns containing important data should be encrypted; this will result in lower CPU load compared with the whole database level encryption. If a column is used as a primary key or used in comparison clauses (WHERE clauses, JOIN conditions) the database will have to decrypt the whole column to perform operations involving those columns.

Dibawah ini adalah demo sederhana tentang proses enkripsi dan dekripsi yang dieksekusi menggunakan Symmetric Key dan algoritma enkripsi Triple DES.

/* Create Database  */
USE master
GO
CREATE DATABASE EncryptTest
ON PRIMARY ( NAME = N'EncryptTest', FILENAME = N'C:\EncryptTest.mdf')
LOG ON ( NAME = N'EncryptTest_log', FILENAME = N'C:\EncryptTest_log.ldf')
GO

Pertama, buat sebuah table contoh dan diisi dengan data contoh kemudian kita akan melakukan satu dari 2 kolom di table tersebut.

/* Create table and insert data in the table */
USE EncryptTest
GO
CREATE TABLE TestTable (FirstCol INT, SecondCol VARCHAR(50))
GO
INSERT INTO TestTable (FirstCol, SecondCol)
SELECT 1,'First'
UNION ALL
SELECT 2,'Second'
UNION ALL
SELECT 3,'Third'
UNION ALL
SELECT 4,'Fourth'
UNION ALL
SELECT 5,'Fifth'
GO
/* Check the content of the TestTable */
USE EncryptTest
GO
SELECT *
FROM TestTable
GO


Kode sebelumnya akan mengembalikan hasil yang digambarkan pada gambar berikutnya.

SQL SERVER - Introduction to SQL Server Encryption and Symmetric Key Encryption Tutorial with Script SqlQueryResult1
Result of the SQL query

Setiap database bisa memiliki satu master key. Kunci master database adalah kunci simetris yang digunakan untuk melindungi kunci privat dari sertifikat dan kunci asimetris yang ada dalam database. Menggunakan algoritma Triple DES bersamaan dengan kata sandi yang disediakan pengguna untuk mengenkripsi kunci.

/* Create Database Master Key */
USE EncryptTest
GO
CREATE MASTER KEY ENCRYPTION
BY PASSWORD = 'SQLAuthority'
GO


Certificate digunakan untuk mengamankan kunci enkripsi, yang digunakan untuk melakukan enkripsi data di dalam database. SQL Server telah mempunyai kemampuan untuk men-generate self-signed X.509 certificate sejak versi 2005.

/* Create Encryption Certificate */
USE EncryptTest
GO
CREATE CERTIFICATE EncryptTestCert
WITH SUBJECT = 'SQLAuthority'
GO


Kunci symetricdapat di enkripsi menggunakan beberapa pilihan seperti certificate, password, kunci symetric, dan kunci asymetric. Beberapa jenis algoritma dapat digunakan untuk melakukan enkripsi terhadap kunci. Algoritma-algoritma yang disupport diantaranya DES, TRIPLE_DES, RC2, RC4, RC4_128, DESX, AES_128, AES_192, and AES_256.

/* Create Symmetric Key */
USE EncryptTest
GO
CREATE SYMMETRIC KEY TestTableKey
WITH ALGORITHM = TRIPLE_DES ENCRYPTION
BY CERTIFICATE EncryptTestCert
GO

Sekarang tambahkan sebuah kolom dengan tipe varbinary, yang akan menyimpan nilai enkripsi untuk kolom kedua.


/* Encrypt Data using Key and Certificate
Add Columns which will hold the encrypted data in binary */
USE EncryptTest
GO
ALTER TABLE TestTable
ADD EncryptSecondCol VARBINARY(256)
GO

Sebelum kunci digunakan, perlu didekripsi menggunakan metode yang sama yang digunakan untuk mengenkripsi. Dalam contoh kami, kami telah menggunakan sertifikat untuk mengenkripsi kunci. Karena alasan yang sama, kami menggunakan sertifikat yang sama untuk membuka kunci dan membuatnya tersedia untuk digunakan. Setelah membukanya dan membuatnya tersedia untuk digunakan, kita dapat menggunakan fungsi enkripsi dan menyimpan nilai terenkripsi dalam database, di kolom EncryptSecondCol.

/* Update binary column with encrypted data created by certificate and key */
USE EncryptTest
GO
OPEN SYMMETRIC KEY TestTableKey DECRYPTION
BY CERTIFICATE EncryptTestCert
UPDATE TestTable
SET EncryptSecondCol = ENCRYPTBYKEY(KEY_GUID('TestTableKey'),SecondCol)
GO


Kita bisa menjatuhkan kolom SecondCol asli, yang sekarang kita enkripsi di kolom EncryptSecondCol. Jika Anda tidak ingin menjatuhkan kolom, Anda dapat menyimpannya untuk perbandingan data di masa mendatang saat mendekripsi kolom.


/* DROP original column which was encrypted for protect the data */
USE EncryptTest
GO
ALTER TABLE TestTable
DROP COLUMN SecondCol
GO

------------------------------------------------------------------------------------------------------------------------
We can run a SELECT query on our database and verify if our data in the table is well protected and hackers will not be able to make use of it even if they somehow manage to reach the data.

/* Check the content of the TestTable */
USE EncryptTest
GO
SELECT *
FROM TestTable
GO
SQL SERVER - Introduction to SQL Server Encryption and Symmetric Key Encryption Tutorial with Script SqlQueryResult2

Hasil dari SQL Query sebelumnya
User yang terotorisasi dapat menggunakan function "decryptbykey" untuk melihata data asli dari kolom yang terenkripsi.

If Symmetric key is not open for decryption, it has to be decrypted using the same certificate that was used to encrypt it. An important point to bear in mind here is that the original column and the decrypted column should have the same data types. If their data types differ, incorrect values could be reproduced. In our case, we have used a VARCHAR data type for SecondCol and EncryptSecondCol.


/* Decrypt the data of the SecondCol */
USE EncryptTest
GO
OPEN SYMMETRIC KEY TestTableKey DECRYPTION
BY CERTIFICATE EncryptTestCert
SELECT CONVERT(VARCHAR(50),DECRYPTBYKEY(EncryptSecondCol)) AS DecryptSecondCol
FROM TestTable
GO
SQL SERVER - Introduction to SQL Server Encryption and Symmetric Key Encryption Tutorial with Script sqlQueryResult3

If you drop the database after the entire processing is complete, you do not have to worry about cleaning up the database. However, in real world on production servers, the database is not dropped. It is a good practice for developers to close the key after using it. If keys and certificates are used only once or their use is over, they can be dropped as well. Dropping a database will drop everything it contains – table, keys, certificates, all the data, to name a few.


/* Clean up database */
USE EncryptTest
GO
CLOSE SYMMETRIC KEY TestTableKey
GO
DROP SYMMETRIC KEY TestTableKey
GO
DROP CERTIFICATE EncryptTestCert
GO
DROP MASTER KEY
GO
USE [master]
GO
DROP DATABASE [EncryptTest]
GO
Summary

Encryption is a very important security feature of SQL Server 2005. Long keys and asymmetric keys create unassailable, stronger encryption and stronger encryption uses lots of CPU to encrypt data. Stronger encryption is slower to process. When there is a huge amount of data to encrypt, it is suggested to encrypt it using a symmetric key. The same symmetric key can be encrypted further with an asymmetric key for additional protection, thereby adding the advantage of a stronger encryption. It is also recommended to compress data before encryption, as encrypted data cannot be compressed.


Salam,