2013-08-22 105 views
0

我想使用一個在線的MYSQL數據庫,主要通過桌面和手機應用程序訪問。我希望某人請快速查看我的代碼,並告訴我需要在安全性方面改變/改進哪些內容。基本上,我的代碼是可以改進還是應該改變?SQL代碼安全

這裏是我的代碼:

Create Database db_person_cdtest; 

USE [db_person_cdtest] 
GO 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE TABLE [Person](
[PersonID] [numeric](18, 0) IDENTITY(1,1) NOT NULL, 
[ID] [varchar](20), 
[FirstName] [varchar](50) NOT NULL, 
[LastName] [varchar](50) NOT NULL, 
[AddressLine1] [varchar](50), 
[AddressLine2] [varchar](50), 
[AddressLine3] [varchar](50), 
[MobilePhone] [varchar](20), 
[HomePhone] [varchar](20), 
[Description] [varchar](10), 
[DateModified] [datetime], 
[PersonCategory] [varchar](30) NOT NULL, 
[Comment] [varchar](max), 
CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED 
(
[PersonID] DESC 
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY] 
) ON [PRIMARY]; 

CREATE PROCEDURE usp_InsertPerson 
(
@ID VARCHAR(20), 
@FirstName VARCHAR(50), 
@LastName VARCHAR(50), 
@AddressLine1 VARCHAR(50), 
@AddressLine2 VARCHAR(50), 
@AddressLine3 VARCHAR(50), 
@MobilePhone VARCHAR(20), 
@HomePhone VARCHAR(20), 
@Description VARCHAR(10), 
@Comment VARCHAR(max) 
) 

AS 

BEGIN 
Declare @PersonCategory VARCHAR(30) 
SET @PersonCategory = dbo.usp_PersonCategoryLookup(@ID, @Description) 
INSERT INTO Person(ID, FirstName, LastName, AddressLine1, AddressLine2, AddressLine3, MobilePhone, HomePhone, Description, DateModified, PersonCategory, Comment) 
VALUES (@ID, @FirstName, @LastName, @AddressLine1, @AddressLine2, @AddressLine3, @MobilePhone, @HomePhone, @Description, GETDATE(), @PersonCategory, @Comment) 
END 

CREATE PROCEDURE usp_UpdatePerson 
(
@PersonID numeric(18, 0), 
@ID VARCHAR(20), 
@FirstName VARCHAR(50), 
@LastName VARCHAR(50), 
@AddressLine1 VARCHAR(50), 
@AddressLine2 VARCHAR(50), 
@AddressLine3 VARCHAR(50), 
@MobilePhone VARCHAR(20), 
@HomePhone VARCHAR(20), 
@Description VARCHAR(10), 
@Comment VARCHAR(max) 
) 

AS 

BEGIN 
    Declare @PersonCategory VARCHAR(30) 
SET @PersonCategory = dbo.usp_PersonCategoryLookup(@ID, @Description) 
Update Person set [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], [email protected], DateModified=GETDATE(), [email protected], [email protected] where [email protected] 
END 

CREATE PROCEDURE usp_SearchPerson 
(
@SearchCriteria VARCHAR(50) 
) 

AS 

BEGIN 
Select * from Person where FirstName like @SearchCriteria or LastName like @SearchCriteria or PersonCategory like @SearchCriteria 
END 

CREATE PROCEDURE usp_SelectPerson 
(
@PersonID numeric(18, 0) 
) 

AS 

BEGIN 
select * from Person where [email protected] 
END 

CREATE FUNCTION usp_PersonCategoryLookup 
(
@ID VARCHAR(20), 
@Description VARCHAR(10) 
) 
RETURNS VARCHAR(30) 
AS 

BEGIN 
    return @ID + @Description 
END 
+1

如果您使用的是MySQL數據庫,爲什麼要使用SQL Server約定編寫代碼? –

回答

0

您可以添加以下列人表:

  • CreatedByUser(VARCHAR或INT)
  • CreatedDateTime(日期時間)
  • LastUpdateByUser (varchar或int)
  • LastUpdateDateTime(datetime)

這是因爲,通過這種方式,您可以查看誰是創建記錄的用戶以及上次更新記錄的用戶,以用於審計目的。

此外,雖然這與安全性無關,但請避免在select語句中使用星號(*)。放置你想要返回的列名。這將在未來爲您節省很多麻煩。

+0

對於人們來說,這似乎是一種常見的方式,但我總覺得'LastUpdateXXX'列被破壞 - 可能有3人對特定行進行了重大更改,然後一些可憐的sap出現並糾正了簡單的拼寫錯誤,然而他們是被LastUpdateXXX列指向的人。如果您需要跟蹤更新,請在單獨的表中跟蹤*每個*更新。 –

0

如果您打算分發此應用程序,請注意,可以輕鬆地反編譯.net應用程序並查看源代碼。這爲用戶提供了獲取數據庫連接信息的潛力,並有可能讓他們訪問完整的數據庫。您可能需要做一點研究,以正確鎖定此項目中使用的用戶帳戶。

此外,忽略任何人說加密連接信息並在運行時解密它。如果你的代碼中有方法在運行時解密,那麼誰反編譯你的應用程序也會有這些方法。代碼混淆是另一種選擇,但只會拖慢流程,而不會阻止流程。