【发布时间】:2014-11-02 20:17:26
【问题描述】:
所以基本上我使用 2 层,第一层称为“BL”(代表业务逻辑),另一层称为“DAL”。
我有一个数据库,其中包含一个用户表(在它的一个表中)。
BL 正在通过引用 (.dll) 访问 DAL,而 DAL 正在访问数据库(BL 无法直接访问数据库)。
我想在 BL 上接收用户信息,将其发送到 DAL,DAL 会将其插入数据库。
我目前的方法:
BL:
public bool InsertUser(string userFName, string userLName, string userPass, DateTime userBirth, string userEmail, string userCountry)
{
if (UsersDAL.Insert(userFName, userLName, userPass, userBirth.ToString(), userEmail, userCountry))
{
return true;
}
return false;
}
DAL:
public static bool Insert(string userFName, string userLName, string userPass, string userBirth, string userEmail, string userCountry)
{
DateTime userBirthday = DateTime.Parse(userBirth);
try
{
OleDbHelper.fill("INSERT INTO UsersTable(userFName, userLName, userPass, userBirth, userEmail, userCountry, userActive) VALUES('" + userFName + "', '" + userLName + "', '" + userPass + "', " + userBirthday + ", '" + userEmail + "', '" + userCountry + "', true)", "UsersTable");
}
catch
{
return false;
}
return true;
}
问题出现在日期时间的事情上,所以我找不到任何解决方案。
注意:在数据库中,“userBirth”是一个日期时间
【问题讨论】:
-
啊! Sql 注入啊。 Aldo:不要将日期时间 a 视为字符串
-
什么问题?另外,为什么要将
DateTime转换为String只是为了在下一个方法中将其转换回DateTime?使用上面提到的 sql 参数。 -
当你去尝试寻找即将到来的生日的人时,你会后悔没有留下
DateTime thingy -
您确实需要参数化该查询。它不仅可以解决 DateTime 问题,还可以帮助保护您免受 SQL 注入攻击,甚至可以通过允许重用 SQL 执行计划来提高性能。