Rav*_*ven 0 c# mysql forms windows sql-injection
如何防止这些代码被 SQL 注入?这是我正在学习的登录系统。这是代码!
\n if (!(string.IsNullOrWhiteSpace(textBox1.Text)) && !(string.IsNullOrWhiteSpace(textBox2.Text)))\n {\n\n MySqlConnection mcon = new MySqlConnection("datasource = 127.0.0.1; port = 3306; username = root; password = ; database = rpgmaster;");\n\n mcon.Open();\n\n DataTable table = new DataTable();\n\n MySqlDataAdapter adapter = new MySqlDataAdapter("Select * From users where Username = '" + textBox2.Text + "' and password = '" + textBox1.Text + "'", mcon);\n \n adapter.Fill(table);\n\n if (table.Rows.Count <= 0)\n {\n MessageBox.Show("Voc\xc3\xaa n\xc3\xa3o est\xc3\xa1 registrado!");\n }\n else\n {\n MessageBox.Show("Logado com sucesso! ");\n }\n\n mcon.Close();\n }\nRun Code Online (Sandbox Code Playgroud)\n谢谢您的帮助!真的很感激!
\n如果您正在学习,您也许可以放弃这种旧的低级数据访问方式,并使用更现代、更简单的方式。Dapper 是一个库的例子,它并没有比你已经知道的知识有巨大的飞跃,但却让你的生活变得更加美好:
using(var conn = new MySqlConnection("conn str here"){
var sql = "SELECT count(*) FROM tblUsers WHERE username = @u AND password = @p";
var prm = new {
u = txtUsername.Text, //give your textboxes better names than textbox2,textbox1!
p = txtPassword.Text.GetHashCode() //do NOT store plain text passwords!
};
bool valid = await conn.QuerySingleAsync<int>(sql, prm) > 0;
if(valid)
... valid login code
else
... invalid login
}
Run Code Online (Sandbox Code Playgroud)
关于此的一些注释:
u = "my username"QuerySingleAsync<int>which来查询it类型的单个值,如果它超过0,登录有效myString.Int1而不是这样的东西myString.Length,并且它将完全无法使用AddWithValue陈述上;使用 Dapper、实体框架、强类型数据集。一些数据库管理技术可以减轻编写代码的负担Dapper 真正为您带来好处的地方在于它能够将对象转换为查询,反之亦然;上面只是一个基本的计数示例,但假设您有一个 User 类:
class User
{
string Name { get; set; }
string HashedPassword { get; set; }
int age {get; set; }
}
Run Code Online (Sandbox Code Playgroud)
并且您有一个类似的表tblUsers(列名称与属性名称相同),那么您可以像这样查询:
User u = new User() { Name = "someuser" };
User t = await conn.QuerySingleAsync<User>("SELECT Name, HashedPassword, Age FROM tblUsers WHERE Name = @Name", u);
Run Code Online (Sandbox Code Playgroud)
我们想要查找someuser用户的所有信息,因此我们用User该Name集合创建一个新的(我们也可以使用匿名类型,如前面的示例),而不做其他任何事情,然后将其作为参数传递。Dapper 将看到查询 contains ,从我们传入的用户中@Name提取 的内容,然后运行查询。当结果返回时,它将为我们创建一个实例,其中完全填充了查询中的所有数据NameuUser
要采用这种旧方法,我们必须:
User,reader.GetInt/GetStringetc将列值一一拉出,编写这些代码是重复的,而且非常无聊。在计算中,当我们遇到重复且无聊的事情时,我们需要在一生中执行数千次(例如序列化为 json、调用 Web 服务、设计 Windows UI),我们会找到一些方法让计算机执行重复的无聊操作; 他们比我们做得更快、更准确。这正是 Dapper 所做的;它消除了那种无聊的重复,并将其简化为一行,您可以在其中说出您想要返回的内容,使用什么查询,使用什么参数。它可以让你的 UI 正常工作:
await x.QueryAsync<type>(query, parameters)
Run Code Online (Sandbox Code Playgroud)
赢。寻找一些 Dapper 教程!(我没有任何隶属关系)