zoukankan      html  css  js  c++  java
  • SQL参数化查询--最有效可预防SQL注入攻击的防御方式

          参数化查询(Parameterized Query 或 Parameterized Statement)是访问数据库时,在需要填入数值或数据的地方,使用参数 (Parameter) 来给值。

      在使用参数化查询的情况下,数据库服务器不会将参数的内容视为SQL指令的一部份来处理,而是在数据库完成SQL指令的编译后,才套用参数运行,因此就算参数中含有指令,也不会被数据库运行。Access、SQL Server、MySQL、SQLite等常用数据库都支持参数化查询。

    在ASP程序中使用参数化查询

      ASP环境下的参数化查询主要由Connection对象Command对象完成。

      Access数据库只支持匿名参数,在传入参数的位置用问号代替即可。SQL Server数据库虽然支持匿名和非匿名的参数,但是在ASP中也仅能使用匿名参数。

    var conn = Server.CreateObject("ADODB.Connection");
    conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("Test.mdb");
    conn.Open();
     
    var cmd = Server.CreateObject("ADODB.Command");
    cmd.ActiveConnection = conn;
    cmd.CommandType = 1;
    cmd.CommandText = "SELECT TOP 1 * FROM [User] WHERE UserName = ? AND Password = ?";
    cmd.Parameters.Append(cmd.CreateParameter("@UserName", 200, 1, 20, "user01"));
    cmd.Parameters.Append(cmd.CreateParameter("@Password", 200, 1, 16, "123456"));
     
    var rs = cmd.Execute();
    Response.Write(rs("UserId").value);
     
    rs.Close();
    conn.Close();
    View Code

    在ASP.NET程序中使用参数化查询

      ASP.NET环境下的查询化查询也是通过Connection对象和Command对象完成。如果数据库是SQL Server,就可以用有名字的参数了,格式是“@”字符加上参数名

    SqlConnection conn = new SqlConnection("server=(local)\SQL2005;user id=sa;pwd=12345;initial catalog=TestDb");
    conn.Open();
     
    SqlCommand cmd = new SqlCommand("SELECT TOP 1 * FROM [User] WHERE UserName = @UserName AND Password = @Password");
    cmd.Connection = conn;
    cmd.Parameters.AddWithValue("UserName", "user01");
    cmd.Parameters.AddWithValue("Password", "123456");
     
    SqlDataReader reader = cmd.ExecuteReader();
    reader.Read();
    int userId = reader.GetInt32(0);
     
    reader.Close();
    conn.Close();
    View Code

    在PHP程序中使用参数化查询 

      MySQL的参数格式与SQL Server有点区别,是以“?”加上参数名

    MySqlConnection conn = new MySqlConnection("server=127.0.0.1;uid=root;pwd=12345;database=test;");
    conn.Open();
    MySqlCommand cmd = new MySqlCommand(“SELECT * FROM `User` WHERE UserName = ?UserName AND Password = ?Password LIMIT 1″);
    cmd.Connection = conn;
    cmd.Parameters.AddWithValue(”UserName”, “user01″);
    cmd.Parameters.AddWithValue(”Password”, “123456″);
    MySqlDataReader reader = cmd.ExecuteReader();
    reader.Read();
    int userId = reader.GetInt32(0);
    reader.Close();
    conn.Close();
    View Code
  • 相关阅读:
    Luogu P4727 [HNOI2009]图的同构记数
    ARC 101 E
    JSOI2019 Round2 游记
    JSOI2019 Round1(十二省联考)游记
    Technocup 2019
    Codeforces Round #533 (Div. 2)比赛总结
    学习链接
    2018.12.29-2018.1.9安师大附中集训
    关于考试
    NOIP2018提高组 游记
  • 原文地址:https://www.cnblogs.com/xiaozi/p/5471283.html
Copyright © 2011-2022 走看看