0

我有一个使用以下方法的 WebService:

    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    [WebMethod]
    public string Login(string passwort, string email, string firma)
    {
        return LoginHelper.Login(passwort, email, firma);
    }

我的 LoginHelper 代码:

    using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Data.SqlClient;

namespace WebService1
{
    public class LoginHelper
    {
        public static string Login(string passwort, string email, string firma)
        {
            string userName = "";

            SqlConnection con = new SqlConnection(@"Data Source=Yeah-PC\SQLEXPRESS;Initial Catalog=works;Integrated Security=true;");

        SqlCommand cmd = new SqlCommand(@"SELECT firma FROM TestData 
                                  WHERE email = @email", con);
        cmd.Parameters.AddWithValue("@email", email);

        con.Open();

        SqlDataReader dr = cmd.ExecuteReader();
                while (dr.Read())
      {
   //userName += dr["email"].ToString();
   //userName += dr["passwort"].ToString();
   userName += dr["firma"].ToString();
     }
    dr.Close();
    con.Close();
    return userName;
        }



    }
}

谢谢你们的帮助

我已经编辑了我的问题。该解决方案现在安全吗?我的意思是反对 SQL 注入。还有什么我可以做得更好的吗?

4

5 回答 5

6

你在打电话 LoginHelper.Login(passwort, email, firma);

但在你的方法

public static string Login(string email, string passwort, string firma)

email 是第一个参数。

实际上在电子邮件参数中您有密码,这就是它不返回任何结果的原因

改变你的login方法LoginHelper如下

public static string Login(string passwort, string email, string firma)
{
    string userName = "";

    using (SqlConnection con = new SqlConnection(@"Data Source=Yeah-PC\SQLEXPRESS;Initial Catalog=works;Integrated Security=true;"))
    using(SqlCommand cmd = new SqlCommand(@"SELECT firma FROM TestData WHERE email = @email", con))
    {
        cmd.Parameters.AddWithValue("@email", email);
        con.Open();
        using (SqlDataReader rdr = cmd.ExecuteReader())
        {
            while (rdr.Read())
            {
                if (rdr["firma"]  != DBNull.Value)
                {
                    userName += rdr["firma"].ToString();
                }

            }
        }
    }

    return userName;
}
于 2012-05-30T15:07:15.343 回答
3

如果您的电子邮件地址包含 @ 字符,那可能是您的问题。@ 是 SQLCommand 的参数标记。它会认为您的电子邮件地址的后半部分是一个 sql 参数。您将需要使用参数传递电子邮件地址。这也可以保护您免受 SQL 注入。Akatakritos 的答案有一个如何将电子邮件作为参数传递的示例。

于 2012-05-30T15:12:19.653 回答
1

此外,出于安全和性能原因,您应该使用 SqlParameters。阅读 SQL 注入攻击。

string userName = "";

SqlConnection con = new SqlConnection(@"Data Source=Yeah-PC\SQLEXPRESS;Initial Catalog=works;Integrated Security=true;");

SqlCommand cmd = new SqlCommand(@"SELECT firma FROM TestData 
                                  WHERE email = @email" con);
cmd.Parameters.AddWithValue("@email", email);

con.Open();

SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
   //userName += dr["email"].ToString();
   //userName += dr["passwort"].ToString();
   userName += dr["firma"].ToString();
}
dr.Close();
con.Close();
return userName;
于 2012-05-30T15:11:18.223 回答
0

根据其他答案和评论。

您有一个安全问题,如果您不打算使用 ORM(实体框架/NHibernate/等...),请使用参数化查询

解决您的问题:

  • 你的数据库中有数据吗?
  • 您是否指向正确的数据库?
  • 你的 SQL 是否正确?
  • 您的 SQL 正在运行吗?
  • 运行 SQL Profiler 并查看正在运行的 SQL,然后在 SQL Management Studio 中进行测试
于 2012-05-30T15:09:05.173 回答
0

不要在代码中传递参数,而是尝试使用 Sqlparameter 添加参数。最佳实践是使用 SQL 参数添加参数。 您还可以通过调试来检查电子邮件的值......无论您传递的信息是否正确。

        SqlConnection conn = new SqlConnection(connectionString);
        conn.Open();
        SqlCommand cmd = new SqlCommand(@"SELECT firma FROM TestData 
                              WHERE email = @email" conn);
        cmd.Parameters.AddWithValue("@email", email);                     
        cmd.Prepare();
        cmd.ExecuteNonQuery();
        SqlDataReader dr = cmd.ExecuteReader();
        while (dr.Read())
            {                  
               userName += dr["firma"].ToString();

            }
        dr.Close();
        conn.Close();
于 2012-05-30T15:11:51.373 回答