代码之家  ›  专栏  ›  技术社区  ›  Javed Akram

阻止我的应用程序进行sql注入?

  •  2
  • Javed Akram  · 技术社区  · 14 年前

    我正在做一个项目,在其中我有一个登录页。

    我限制用户进入

    是否异或^

    7 回复  |  直到 14 年前
        1
  •  12
  •   Justin Niessner    14 年前

    不,一点也不。

    例如,我仍然可以将用户名输入为:

    ; DELETE FROM Users --
    

    为了充分保护自己免受SQL注入攻击,您应该转义任何用户输入,并使用参数化查询或存储过程(如果使用存储过程,请确保存储过程中没有动态生成的SQL)与数据库交互。

        2
  •  6
  •   ChrisLively    14 年前

    你不必费心在他们的用户名/密码中寻找特殊的单词/字符。因为你总是会错过一些东西。

    相反,如果您嵌入了SQL,则应该使用参数化查询。如果您对所有查询都这样做,那么您就不会受到sql注入的影响。现在,XSS是另一回事。。;)

        3
  •  2
  •   Hunter    14 年前

    使用存储过程或参数化查询将阻止SQL注入。

    1) 此外,如果使用的是ASP.NET,则可以启用页级属性“ValidateRequest=True”,该属性可以验证任何输入字符串是否会导致脚本注入

    2) 确保没有向最终用户显示系统生成的实际错误。这将导致黑客进一步调查并破坏系统。

    3) 如果使用webservice使用数据并将数据同步到数据库,请在持久化数据之前验证所有必需的字段。

        4
  •  1
  •   Community CDub    8 年前

    避免SQL注入的最简单方法是使用参数化查询。

    请看这个问题: Preventing SQL Injection in ASP.Net VB.Net 所有的答案都能给你一个想法。

    简而言之,我从不使用连接字符串查询,而是始终使用参数。这样,根本就没有危险,这是防止SQL注入的最安全的方法。

        5
  •  0
  •   Community CDub    8 年前

    What is SQL injection?

    其次,不要忘记,在UI中进行什么验证并不重要,人们总是可以构造自定义HTTP请求并将它们发送到服务器(简单地说就是使用firebug进行编辑)。

        6
  •  0
  •   Bengie    14 年前

    就像别人说的。参数化输入。

    但请注意我如何在实际的SQL字符串中使用变量,并使用“da.SelectCommand.Parameters.AddWithValue”分配变量

    public Boolean Login(string strUserName, string strPassword)
            {
                SqlConnection sqlConn = new System.Data.SqlClient.SqlConnection();
                DataSet ds = null;
                SqlDataAdapter da = null;
    
                sqlConn.ConnectionString = strConnString;
    
                try
                {
                    blnError = false;
                    sqlConn.Open();
    
                    ds = new DataSet();
                    da = new SqlDataAdapter("select iuserid from tbl_Table where vchusername = @vchUserName and vchpassword = @vchPassword", sqlConn);
    
                    da.SelectCommand.Parameters.AddWithValue("@vchUserName", strUserName);
                    da.SelectCommand.Parameters.AddWithValue("@vchPassword", strPassword);
    
                    da.SelectCommand.CommandTimeout = 30;
                    da.Fill(ds);
    
                    if (ds.Tables[0].Rows.Count > 0)
                    {
                        iUserId = (int)ds.Tables[0].Rows[0]["iuserid"];
                    }
                }
                catch (Exception ex)
                {
                    blnError = true;
                    Log("Login: " + ex.Message);
                }
                finally
                {
                    if (sqlConn.State != ConnectionState.Closed)
                        sqlConn.Close();
                    if (da != null)
                        da.Dispose();
                    if (ds != null)
                        ds.Dispose();
                }
                if (blnError)
                    return false;
                if (iUserId > 0)
                    return true;
                return false;
            }
    
        7
  •  -1
  •   Karl Gohery    14 年前