Connecting to a Database Securely
To protect against database vulnerabilities such as SQL injection attacks, user input should be verified, and statements that connect to databases should be built securely. This topic provides example code that uses placeholders (also called parameterized commands) to connect to a database.
Note
Most of the example code in the IIS SDK does not include user input validation because emphasis would be taken away from the programming element that the example code is illustrating. If you use code examples from other topics in the IIS SDK, consider adding the examples from the Writing Secure IIS Applications section to improve security.
Common Mistake
A common mistake when connecting to a database is to use form input to construct a database query string in the following manner:
strSQL = "select * from MyTable where Name = '" & Request.Form("Name") & "'"
This allows a malicious user to send the following string as the Name variable:
Mary Graham' or 1=1 --
The resulting query string would look like the following:
select * from MyTable where Name = 'Mary Graham' or 1=1 --'
This query string would return the expected record for Mary Graham, but it would also return any record where 1=1, which is every record in the MyTable table. SQL injection might also be used to create, add, or delete records.
Many developers believe that quoting string inputs or calling stored procedures mitigates this problem, but those methods do not provide full protection.
Using Parameterized Commands
Using placeholders (also called parameterized commands) provides the best protection against SQL injection attacks. When you define a query, you determine which parts of the statement are parameters. For example, the following is a parameterized version of the previous query, with an additional parameter for a password:
select * from MyTable where Name=? and Pwd=?
Example Code
The following example shows you how to use Visual Basic Scripting Edition (VBScript) to parameterize a connection string. This example connects to a SQL server named MyServer to verify that a user name and password exists, while protecting against SQL injection attacks.
This example was taken from the chapter titled "Database Security Issues" of the book titled Writing Secure Code (ISBN 0-7356-1722-8).
xFunction IsValidUserAndPwd(strName, strPwd)
' Use a trusted connection to SQL server. Never use the sa account.
strConn = "Provider=sqloledb;" +_
"Server=MyServer;" +_
"database=MyTable;" +_
"trusted_connection=yes"
Set cn = CreateObject("ADODB.Connection")
cn.Open strConn
Set cmd = CreateObject("ADODB.Command")
cmd.ActiveConnection = cn
cmd.CommandText = _
"select * from MyTable where Name=? and Pwd=?"
cmd.CommandType = 1 'adCmdText
cmd.Prepared = True
' Explanation of numeric parameters:
' data type is 200, varchar string
' direction is 1, input parameter only
' size of data is 32 chars max.
Set parm1 = cmd.CreateParameter("Name", 200, 1, 32, "")
cmd.Parameters.Append parm1
parm1.Value = strName
Set parm2 = cmd.CreateParameter("Pwd", 200, 1, 32, "")
cmd.Parameters.Append parm2
parm1.Value = strPwd
Set rs = cmd.Execute
IsValidUserAndPwd = False
If 1 = rs(0).value Then IsValidUserAndPwd = True
rs.Close
cn.Close
End Function