Lettura Prevenzione degli attacchi SQL Injection nelle stored procedure ha iniziato questo dibattito tra me e il mio partner --- e cercare l'approccio giusto non è così semplice.
Non sono un esperto di sicurezza, ma cosa fa una persona quando dai un'occhiata alle prime righe di questa stored procedure ... e vedi questo.
Non abbiamo avuto problemi di sicurezza significativi, ma non voglio presumere che questo approccio funzioni ... Se è così, lascia perdere o migliora.
ASP:
Dim conStr = ConfigurationSettings.AppSettings("WebUser")
Dim command = ("Execute dbo.web_Insert_usr_Comments @Location," & _
"@userexp, @full_name, @emailAddr, @comments")
Using con As New SqlConnection(conStr)
Using cmd As New SqlCommand(command, con)
cmd.Parameters.AddWithValue("@Location", Request.QueryString("Location"))
cmd.Parameters.AddWithValue("@userexp", Request.QueryString("usrexp"))
cmd.Parameters.AddWithValue("@comments", Request.QueryString("comments"))
cmd.Parameters.AddWithValue("@full_name", Request.QueryString("full_name"))
cmd.Parameters.AddWithValue("@emailAddr", Request.QueryString("emailAddr"))
con.Open()
cmd.ExecuteNonQuery()
End Using
End Using
TSQL:
ALTER PROCEDURE [dbo].[web_Insert_usr_Comments]
@Location varchar(255),
@usrexp int = NULL,
@full_name varchar(255) = NULL,
@emailAddr varchar(320) = NULL,
@comments varchar(125) = NULL
AS
BEGIN
DECLARE @securityChk varchar(255), @haveContact INT
SET @securityChk = (SELECT @location + CAST(@usrexp AS VARCHAR(2)) + @full_name + @emailAddr + @usr_comments )
IF @securityChk LIKE '%SELECT%' RETURN;
IF @securityChk LIKE '%DROP%' RETURN;
IF @securityChk LIKE '%INSERT%' RETURN;
IF @securityChk LIKE '%DELETE%' RETURN;
IF @securityChk LIKE '%EXE%' RETURN;
SET @haveContact = ( SELECT (count(*))
FROM dbo.contacts
WHERE ( @emailAddr = E_mail_address AND @location = company))
--> Check and see if we have this person contact info
IF ( @haveContact = 0 )
BEGIN
INSERT INTO dbo.contacts(e_mail_address, company, nick_name)
VALUES (@emailAddr, @location, @full_name)
END
ELSE
BEGIN
INSERT INTO web_comments_dtl(timeGMT, form_id, contact_id, comment, user_exp_ranking, IP_Addr)
SELECT GETDATE()
, 1 --> TODO: Need better logic for form_id
, ( SELECT MAX(id)
FROM dbo.contacts
WHERE ( @emailAddr = E_mail_address AND @location = company)
OR ( @emailAddr = E_mail_address AND @full_name = nick_name )
OR ( @location = company))
, @RFXcomments
, @usrexp
, dbo.fnBinaryIPv4(@ip_Addr)
END
END
Cosa mi piacerebbe fare, ma non sono sicuro di quale sia l'opzione più efficiente.
- Dovrebbe trascorrere una settimana o due e indagare sui problemi di sicurezza (se ce n'è uno) e il modulo di input dell'utente che chiama questo SP
- Riscrivi tutto, incluso SP, codice dietro e riconfigura IIS
- Aggiungi altre clausole alla dichiarazione precedente.
Non penso che ci sia un problema di sicurezza ... ma se il ragazzo prima decide di inserire questo nel suo codice - cosa dovrebbe fare un giovane DBA.