gpt4 book ai didi

asp.net - 使用 ASP.net 和 Access 数据库从 SQL 注入(inject)中保护网站

转载 作者:行者123 更新时间:2023-12-01 05:23:09 25 4
gpt4 key购买 nike

我目前有一个正常注册和登录的网站,用 ASP.net 编码。
我正在使用 Access 数据库,同时使用我 friend 编写的 C# 类来处理大多数数据库操作(executeQuery、executeRead、isExits...)。

现在我几乎完成了我的网站的构建,我想开始添加安全性 - 主要是添加到我的数据库中。我已经搜索了一段时间来寻找有关该主题的教程,但是除了一篇旧的 microsoft msdn 文章之外,我找不到任何好的东西,我无法真正让它的代码工作。
我现在最远的就是不允许在用户名和密码中使用任何危险字符(例如',--,;),但感觉好像这是我可以使用的更糟糕的解决方案(为什么不应该我的用户不使用这个字符吗?)。

我认为我找到的最佳解决方案是在声明后以某种方式将变量插入查询字符串(与“WHERE username=@user”或类似的东西有关),但我无法使用它 Access 并使用我的 oleDBManager。

这是我目前的注册码。 handle() 正在从字符串中删除所有 ',而 Validate() 检查字符串中的危险部分。

        string username = user.Text;
string password = pass.Text;
bool isThingy = false;
if (handle(ref password)) isThingy = true;
if (handle(ref username)) isThingy = true;

if (username != "" && username != null)
{
if (password != "" && password != null)
{
if (Validate(username, password))
{
if ((db.IsExist("SELECT * FROM Table1 WHERE username='" + username + "'") == false))
{
int a = db.ExecuteQuery("INSERT INTO `Table1`(`username`, `password`, `logins`, `email`, `fname`, `lname`, `country`, `city`, `birthday`, `userid`) VALUES ('" + username + "', '" + password + "', '0', '', '', '', '', '', '', '" + Convert.ToString(Convert.ToInt32(db.ExecuteCellRead("SELECT MAX(userid) FROM Table1")) + 1) + "');");

if (!isThingy) errorLabel.Text = "Your user has been successfully registered";
else errorLabel.Text = "The ' token is invalid. your user was registered absence the '.";
}
else
errorLabel.Text = "This username is already taken";
}
else errorLabel.Text = "Invalid name format";

}
else errorLabel.Text = "Please enter a password";
}
else errorLabel.Text = "Please enter a user name";

至于 oleDBManager (在我的代码中命名为 db ):
    private OleDbConnection link; // The link instance
private OleDbCommand command; // The command object
private OleDbDataReader dataReader; // The data reader object
private OleDbDataAdapter dataAdapter; // the data adapter object
private DataTable dataTable; // the data table object
private string dbName; // the Database filename
private int version; // the usersTableG office version
private string connectionString; // the connection string for the database connection
private string provider; // the matching driver string for the connection string
private string path; // the path to the database file


...


public int ExecuteQuery(string query)
{
this.link.Open();
int rowsAffected;
// ---
this.command = new OleDbCommand(query, this.link);
try
{
rowsAffected = this.command.ExecuteNonQuery();
}
catch (InvalidOperationException e)
{
if (e.Data == null)
throw;
else
rowsAffected = -1;
}
finally
{
this.command.Dispose();
this.link.Close();
}
// ---
return rowsAffected;
}

public bool IsExist(string query)
{
this.link.Open();
// ---
this.command = new OleDbCommand(query, this.link);
this.dataReader = this.command.ExecuteReader();
bool a = this.dataReader.Read();
// ---
this.command.Dispose();
this.link.Close();
// ---
return a;
}

public string ExecuteCellRead(string query)
{
string output = "";
this.dataTable = this.ExcecuteRead(query);

foreach (DataRow row in this.dataTable.Rows)
{
foreach (object obj in row.ItemArray)
{
output += obj.ToString();
}
}

return output;
}

因此,如您所见,主要问题是用户现在不能将字符用作 '.
它假设最好的解决方案是在 SQL 查询中使用 @ 变量,但我不知道如何。

[感谢您的帮助]
PS。我已经改变了我的 table 的名字;)

编辑:你们中的大多数人都告诉我使用这些参数化查询,但是如果你能给我一个如何使用它们的例子,那就太好了,因为我从来没有这样做过



所以,感谢@Remou,我的 最终 代码是:
    db.DoWeirdStackOverFlowStuff(
"INSERT INTO `Table1`(`username`, `password`, `logins`) VALUES (@username, @password, '0');"
, new string[] { "@username", "@password" }
, new string[] { username, password });


    public int DoWeirdStackOverFlowStuff(string query, string[] vars, string[] reps)
{
this.link.Open();
int rowsAffected;
// ---
this.command = new OleDbCommand();
this.command.CommandText = query;
this.command.CommandType = System.Data.CommandType.Text;
this.command.Connection = this.link;

//Parameters in the order in which they appear in the query
for (int i = 0; i < vars.Length; i++)
this.command.Parameters.AddWithValue(vars[i], reps[i]);

try
{
rowsAffected = this.command.ExecuteNonQuery();
}
catch (InvalidOperationException e)
{
if (e.Data == null)
throw;
else
rowsAffected = -1;
}
finally
{
this.command.Dispose();
this.link.Close();
}
// ---
return rowsAffected;
}

对于需要这个的人=]

最佳答案

一些笔记

在 MS Access 中,我保存了一个名为 UpdateUser 的查询,它看起来像这样:

       UPDATE INTERNETSETTINGS 
SET url = [@url],
databasename = [@databasename],
port = [@port],
username = [@username],
[password] = [@password]

我可以使用命令对象在我的代码中按名称引用此查询:
        OleDbCommand Command = new OleDbCommand();

Command.CommandText = "UpdateUser"; //saved query
Command.CommandType = System.Data.CommandType.StoredProcedure;
Command.Connection = cn; //a connection to the database

//Parameters in the order in which they appear in the query
Command.Parameters.AddWithValue("@url", "a"); //a,b,c etc for my test run
Command.Parameters.AddWithValue("@databasename", "b");
Command.Parameters.AddWithValue("@port","c");
Command.Parameters.AddWithValue("@username", "d");
Command.Parameters.AddWithValue("@password", "e");

Command.ExecuteNonQuery();

关于asp.net - 使用 ASP.net 和 Access 数据库从 SQL 注入(inject)中保护网站,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15414246/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com