使用C#和SQL注入创建数据库

RRM*_*RRM 5 .net c# sql sql-server

我有以下代码用于从C#应用程序创建一些数据库

SqlConnection myConnection = new SqlConnection(ConnectionString);
string myQuery = "CREATE DATABASE " + tbxDatabase.Text; //read from textbox
myConnection.Open();
SqlCommand myCommand = new SqlCommand(myQuery, myConnection);
myCommand.ExecuteNonQuery();
Run Code Online (Sandbox Code Playgroud)

现在我担心它是否安全,C#会接受黑客输入,如"A; DROP TABLE B"或类似的东西吗?如何让它更安全?

Joh*_*Woo 5

表名和列名不能参数化,但对于第一道防线,用大括号等分隔符包裹表名,

string myQuery = "CREATE DATABASE [" + tbxDatabase.Text + "]";
Run Code Online (Sandbox Code Playgroud)

或者创建一个用户定义的函数来检查输入的值,例如

private bool IsValid(string tableName)
{
    // your pseudocode
    // return somthing
}
Run Code Online (Sandbox Code Playgroud)

然后在你的代码上,

if (IsValid(tbxDatabase.Text))
{
    SqlConnection myConnection = new SqlConnection(ConnectionString);
    string myQuery = "CREATE DATABASE [" + tbxDatabase.Text + "]";
    myConnection.Open();
    SqlCommand myCommand = new SqlCommand(myQuery, myConnection);
    myCommand.ExecuteNonQuery();
}
else
{
    // invalid name
}
Run Code Online (Sandbox Code Playgroud)

  • 我同意您的验证建议,但是如何在表名中添加括号提供安全性?例如`"test] drop database xxx --"` (2认同)