elamlar,
Kendi Veritabanımda Kullandığım Regex(Regular Expression) Sizinle Paylaşayım Dedim, Baktım Bir Dünya Konu Var..
2 Aşama Göreceksiniz fakat Sadece 1. Aşama da İşinizi Görür, 2. Aşama Sadece Ek Güvenlik Tercihe Bağlı...
Gel Gelelim 1. Aşamayı Uygulayınca Ne Olacak ?
Şöyle Diyeyim "a-Z / 0-9 / _" Karakterleri Sadece ID ve Şifrede Kullanabilir, Kesinlikle Hiç Bir ASCII Karakter ile Oyuna Giremez Tamamiyle %100'dür.
Kullanılabilecek Küçük Harfler : abcdefghijklmnoprstuvyzxwq
Kullanılabilecek Büyük Harfler : ABCDEFGHIJKLMNOPRSTUVYZXWQ
Kullanılabilecek Sayılar : 0123456789
Kullanılabilecek Karakterler : _ (Alttan Tire, Aşağıda İsterseniz Onuda Kaldırabilirsiniz)
Kısacası Mevcutta Kullandığınız RULES v.s. ne Var ise Silin Gitsin, Son Nokta Konulmuştur
1. AŞAMA (Türkçe Karakterin ve Tüm Karakterlerin Tarih Olması) ;
Fonksiyonumuz ;
Kod:
CREATE FUNCTION [dbo].[IsValidCharacters](@SData varchar(8000))
RETURNS INT
AS
/*
Author : AKUMA
Update : 16.10.2009 - 15:30
*/
BEGIN
DECLARE @SDataLen int
DECLARE @Loop int
DECLARE @Letter varchar(1)
DECLARE @RXLetters varchar(8000)
DECLARE @Match tinyint
SET @RXLetters = 'qwertyuopasdfghjklizxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890_'
SET @SDataLen = LEN(@SData)
SET @Loop = 1
SET @Match = 0
WHILE @Loop < (@SDataLen + 1)
BEGIN
SET @Letter = RTRIM(LTRIM(SUBSTRING(@SData,@Loop,1)))
IF CHARINDEX(@Letter,@RXLetters) = 0
BEGIN
SET @Match = 1
BREAK
END
SET @Loop = @Loop + 1
END
RETURN @Match
END
Önemli Bilgiler ;
Kod:
-- Aşağıda '.....' Arasına Koyduğunuz Her Karakter Geçerli Karakter
Sayılır Örneğin Æ yi Koyarsanız Geçerli Olur, Koymazsanız Geçersiz Olur.
SET @RXLetters = 'qwertyuopasdfghjklizxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890_'
Kodun Uygulanması ;
ACCOUNT_LOGIN,ACCOUNT_LOGIS,MAIN_LOGIN veya MYST_LOGIN Ana Logininiz Hangisi ise...
Kod:
CREATE PROCEDURE [dbo].[ACCOUNT_LOGIN]
@AccountID varchar(21),
@Password varchar(13),
@nRet smallint OUTPUT
AS
-- Tam Buraya
AS'ın Hemen Altına Şunu Yazıyorsunuz... (Alttan Tire Kullanılabilir Hali.)
Kod:
IF dbo.IsValidCharacters(@AccountID) = 1
BEGIN
SET @nRet = 2 -- Hesap Bulunamadı.
RETURN
END
IF dbo.IsValidCharacters(@Password) = 1
BEGIN
SET @nRet = 3 -- Şifreniz Hatalıdır.
RETURN
END
2. AŞAMA (EK Güvenlik) : Aynı Anda İki Hesabın Oyuna Girmesine Engeller, Örneğin "aktas" Diye Bir Hesabım Var Benim Biride "aktaş" Açtı fakat Birşekilde Paketleri Editledi ve "aktas" Yapıp Karaktere Girmesini Engellemektedir.
PROC_INSERT_CURRENTUSER'nüzü
Açın ve SET @nRet = 1 Yazan Yerin Hemen Üstüne Dikkat Edin Üstüne
Altına Değil Alttaki Kodu Yapıştırın ve Kaydedin Bu Kadar.
Kod:
DECLARE @RAccountID char(21)
/*
Author : AKUMA
Update : 26.07.2009 - 22:45
*/
SELECT @RAccountID = strAccountID FROM ACCOUNT_CHAR WHERE strCharID1 = @CharID and strCharID1 IS NOT NULL
SELECT @RAccountID = strAccountID FROM ACCOUNT_CHAR WHERE strCharID2 = @CharID and strCharID2 IS NOT NULL
SELECT @RAccountID = strAccountID FROM ACCOUNT_CHAR WHERE strCharID3 = @CharID and strCharID3 IS NOT NULL
IF @RAccountID IS NULL
BEGIN
SET @nRet = 0
RETURN
END
ELSE IF @RAccountID = ''
BEGIN
SET @nRet = 0
RETURN
END
ELSE IF @RAccountID <> @AccountID
BEGIN
SET @nRet = 0
RETURN
END
Yapamıyanlar İçin Komple PROC_INSERT_CURRENTUSER (Ekisini Silin Bunu Koyun Yerine - Query Any.)
Procedürü Silemiyenler Bu Şekilde Silebilir.
Kod:
DELETE PROC PROC_INSERT_CURRENTUSER
Kod:
CREATE PROCEDURE PROC_INSERT_CURRENTUSER
@AccountID char(21),
@CharID char(21),
@ServerNo int,
@ServerIP char(15),
@ClientIP char(15),
@nRet smallint output
AS
/*
Author : AKUMA
Update : 26.07.2009 - 22:12
*/
INSERT
INTO CURRENTUSER (nServerNo, strAccountID, strCharID, strServerIP,
strClientIP) VALUES (@ServerNo, @AccountID, @CharID,@ServerIP,@ClientIP)
DECLARE @RAccountID char(21)
SELECT @RAccountID = strAccountID FROM ACCOUNT_CHAR WHERE strCharID1 = @CharID and strCharID1 IS NOT NULL
SELECT @RAccountID = strAccountID FROM ACCOUNT_CHAR WHERE strCharID2 = @CharID and strCharID2 IS NOT NULL
SELECT @RAccountID = strAccountID FROM ACCOUNT_CHAR WHERE strCharID3 = @CharID and strCharID3 IS NOT NULL
IF @RAccountID IS NULL
BEGIN
SET @nRet = 0
RETURN
END
ELSE IF @RAccountID = ''
BEGIN
SET @nRet = 0
RETURN
END
ELSE IF @RAccountID <> @AccountID
BEGIN
SET @nRet = 0
RETURN
END
ELSE
BEGIN
SET @nRet = 1
RETURN
END
Kolay Gelsin...!
Kendi Veritabanımda Kullandığım Regex(Regular Expression) Sizinle Paylaşayım Dedim, Baktım Bir Dünya Konu Var..
2 Aşama Göreceksiniz fakat Sadece 1. Aşama da İşinizi Görür, 2. Aşama Sadece Ek Güvenlik Tercihe Bağlı...
Gel Gelelim 1. Aşamayı Uygulayınca Ne Olacak ?
Şöyle Diyeyim "a-Z / 0-9 / _" Karakterleri Sadece ID ve Şifrede Kullanabilir, Kesinlikle Hiç Bir ASCII Karakter ile Oyuna Giremez Tamamiyle %100'dür.
Kullanılabilecek Küçük Harfler : abcdefghijklmnoprstuvyzxwq
Kullanılabilecek Büyük Harfler : ABCDEFGHIJKLMNOPRSTUVYZXWQ
Kullanılabilecek Sayılar : 0123456789
Kullanılabilecek Karakterler : _ (Alttan Tire, Aşağıda İsterseniz Onuda Kaldırabilirsiniz)
Kısacası Mevcutta Kullandığınız RULES v.s. ne Var ise Silin Gitsin, Son Nokta Konulmuştur
1. AŞAMA (Türkçe Karakterin ve Tüm Karakterlerin Tarih Olması) ;
Fonksiyonumuz ;
Kod:
CREATE FUNCTION [dbo].[IsValidCharacters](@SData varchar(8000))
RETURNS INT
AS
/*
Author : AKUMA
Update : 16.10.2009 - 15:30
*/
BEGIN
DECLARE @SDataLen int
DECLARE @Loop int
DECLARE @Letter varchar(1)
DECLARE @RXLetters varchar(8000)
DECLARE @Match tinyint
SET @RXLetters = 'qwertyuopasdfghjklizxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890_'
SET @SDataLen = LEN(@SData)
SET @Loop = 1
SET @Match = 0
WHILE @Loop < (@SDataLen + 1)
BEGIN
SET @Letter = RTRIM(LTRIM(SUBSTRING(@SData,@Loop,1)))
IF CHARINDEX(@Letter,@RXLetters) = 0
BEGIN
SET @Match = 1
BREAK
END
SET @Loop = @Loop + 1
END
RETURN @Match
END
Önemli Bilgiler ;
Kod:
-- Aşağıda '.....' Arasına Koyduğunuz Her Karakter Geçerli Karakter
Sayılır Örneğin Æ yi Koyarsanız Geçerli Olur, Koymazsanız Geçersiz Olur.
SET @RXLetters = 'qwertyuopasdfghjklizxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890_'
Kodun Uygulanması ;
ACCOUNT_LOGIN,ACCOUNT_LOGIS,MAIN_LOGIN veya MYST_LOGIN Ana Logininiz Hangisi ise...
Kod:
CREATE PROCEDURE [dbo].[ACCOUNT_LOGIN]
@AccountID varchar(21),
@Password varchar(13),
@nRet smallint OUTPUT
AS
-- Tam Buraya
AS'ın Hemen Altına Şunu Yazıyorsunuz... (Alttan Tire Kullanılabilir Hali.)
Kod:
IF dbo.IsValidCharacters(@AccountID) = 1
BEGIN
SET @nRet = 2 -- Hesap Bulunamadı.
RETURN
END
IF dbo.IsValidCharacters(@Password) = 1
BEGIN
SET @nRet = 3 -- Şifreniz Hatalıdır.
RETURN
END
2. AŞAMA (EK Güvenlik) : Aynı Anda İki Hesabın Oyuna Girmesine Engeller, Örneğin "aktas" Diye Bir Hesabım Var Benim Biride "aktaş" Açtı fakat Birşekilde Paketleri Editledi ve "aktas" Yapıp Karaktere Girmesini Engellemektedir.
PROC_INSERT_CURRENTUSER'nüzü
Açın ve SET @nRet = 1 Yazan Yerin Hemen Üstüne Dikkat Edin Üstüne
Altına Değil Alttaki Kodu Yapıştırın ve Kaydedin Bu Kadar.
Kod:
DECLARE @RAccountID char(21)
/*
Author : AKUMA
Update : 26.07.2009 - 22:45
*/
SELECT @RAccountID = strAccountID FROM ACCOUNT_CHAR WHERE strCharID1 = @CharID and strCharID1 IS NOT NULL
SELECT @RAccountID = strAccountID FROM ACCOUNT_CHAR WHERE strCharID2 = @CharID and strCharID2 IS NOT NULL
SELECT @RAccountID = strAccountID FROM ACCOUNT_CHAR WHERE strCharID3 = @CharID and strCharID3 IS NOT NULL
IF @RAccountID IS NULL
BEGIN
SET @nRet = 0
RETURN
END
ELSE IF @RAccountID = ''
BEGIN
SET @nRet = 0
RETURN
END
ELSE IF @RAccountID <> @AccountID
BEGIN
SET @nRet = 0
RETURN
END
Yapamıyanlar İçin Komple PROC_INSERT_CURRENTUSER (Ekisini Silin Bunu Koyun Yerine - Query Any.)
Procedürü Silemiyenler Bu Şekilde Silebilir.
Kod:
DELETE PROC PROC_INSERT_CURRENTUSER
Kod:
CREATE PROCEDURE PROC_INSERT_CURRENTUSER
@AccountID char(21),
@CharID char(21),
@ServerNo int,
@ServerIP char(15),
@ClientIP char(15),
@nRet smallint output
AS
/*
Author : AKUMA
Update : 26.07.2009 - 22:12
*/
INSERT
INTO CURRENTUSER (nServerNo, strAccountID, strCharID, strServerIP,
strClientIP) VALUES (@ServerNo, @AccountID, @CharID,@ServerIP,@ClientIP)
DECLARE @RAccountID char(21)
SELECT @RAccountID = strAccountID FROM ACCOUNT_CHAR WHERE strCharID1 = @CharID and strCharID1 IS NOT NULL
SELECT @RAccountID = strAccountID FROM ACCOUNT_CHAR WHERE strCharID2 = @CharID and strCharID2 IS NOT NULL
SELECT @RAccountID = strAccountID FROM ACCOUNT_CHAR WHERE strCharID3 = @CharID and strCharID3 IS NOT NULL
IF @RAccountID IS NULL
BEGIN
SET @nRet = 0
RETURN
END
ELSE IF @RAccountID = ''
BEGIN
SET @nRet = 0
RETURN
END
ELSE IF @RAccountID <> @AccountID
BEGIN
SET @nRet = 0
RETURN
END
ELSE
BEGIN
SET @nRet = 1
RETURN
END
Kolay Gelsin...!