1

我想用我的 ASP.net 代码完成两件事,因为我是初学者,所以我现在正在努力完成:

1) 我在Login.aspx中的代码目前容易受到 SQL 注入的影响,如何才能将我的 SQL 注入风险降到最低?

using System;
using System.Collections;
using System.Configuration;
using System.Data.SqlClient;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Web.Configuration;

public partial class login : System.Web.UI.Page
{

    protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
    {
        string username = Login_Box.UserName;
        string pwd = Login_Box.Password;

        string strConn;
        strConn = WebConfigurationManager.ConnectionStrings["team13ConnectionString"].ConnectionString;
        SqlConnection Conn = new SqlConnection(strConn);
        Conn.Open();

        string sqlUserName;
        sqlUserName = "SELECT id,pass FROM ts_dept ";
        sqlUserName += " WHERE (id ='" + username + "')";
        sqlUserName += " AND (pass ='" + pwd + "')";
        SqlCommand com = new SqlCommand(sqlUserName, Conn);

        string CurrentName;
        CurrentName = (string)com.ExecuteScalar();

        if (CurrentName != null)
        {
            Session["UserAuthentication"] = username;
            Session.Timeout = 1;
            Response.Redirect("Default.aspx");
        }
        else
        {
            Session["UserAuthentication"] = "";
        }
    }
}

2) Default.aspx是我网站的主页。如果用户尚未登录,则无法访问它,我如何在此处检查 Session["Authentication"] (如果为 null,则用户被重定向到Login.aspx。这是我目前的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace Team13
{
    public partial class default : System.Web.UI.Page
    {

    }
}
4

3 回答 3

2

看看使用参数化 sql来防止 sql 注入攻击。

但是,一般来说,我建议使用 asp.net 通用提供程序作为会员,因为这些将确保您拥有强大/安全的会员功能

看到这个这个让你开始。

于 2013-03-23T04:28:50.747 回答
1

我首先将服务器验证放在文本框上。也许最大长度会有所帮助?还要防止使用撇号。

在第二部分尝试这样的事情,也许也可以测试空字符串:

If (Session("UserAuthentication") Is Nothing) 
{
    Response.Redirect("Login.aspx")
}

更新

表单身份验证可以解决您遇到的两个问题,并且是内置的。如果需要,您可以对其进行自定义以满足您的需求。可以在http://www.codeproject.com/Articles/408306/Understanding-and-Implementing-ASP-NET-Custom-Form找到一个很好的教程

或者,您可以更改 SQL 命令以恢复提供的用户名的密码,并在取回数据后进行字符串比较。

"SELECT pass FROM ts_dept WHERE (id ='" + username + "')";
于 2013-03-23T02:53:09.803 回答
1

防止sql注入的最佳做法是:

  1. 使用命令参数将任何用户值传递给 sql 以执行语句。
  2. 始终用户 sp_execute() 系统存储过程,用于在 DB 上执行 sql 语句
  3. 在放置值 sql 语句之前始终验证用户输入值。
于 2013-03-23T04:36:12.007 回答