问题1:在web.config中定义连接字符串
<add key="xyzl.ConnectionString" value="Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=Data/xyzl.mdb" />
程序中用ConfigurationSettings.AppSettings["xyzl.ConnectionString"]取得的路径为
f:/windows/system32/inetsrv/xyzl/Data/xyzl.mdb
不是我需要的F:/Inetpub/wwwroot/xyzl/Data/xyzl.mdb
应该怎么样写才能得到我想要的,写绝对路径吗?那我要上传到虚拟主机就会麻烦了,我不知
道虚拟主机上的路径。问题2:sql = "SELECT * FROM Users WHERE Login='{0}' AND Pwd='{1}'";
sql = String.Format(sql,txtLogin.Text,txtPwd.Text());
这样写算不算传参,能不能和SQLSEVER的cmd.Parameters.Add()传参一样防止SQL注入。问题3:为了得到用户权限,在Global的Application_AuthenticateRequest(Object sender,
EventArgs e)中这样写道: HttpApplication app = (HttpApplication)sender;
if (app.Request.IsAuthenticated)
{
OleDbConnection con;
string sql;
OleDbCommand cmd; string id = Context.User.Identity.Name; con = new OleDbConnection(
ConfigurationSettings.AppSettings
["cnFriends.ConnectionString"]); //此处是对的
sql = "SELECT IsAdministrator FROM [User] WHERE UserId='{0}'";
sql = String.Format(sql, id);
cmd = new OleDbCommand(sql, con);
con.Open();
try
{
object admin = cmd.ExecuteScalar(); if (admin != null)
{
GenericPrincipal ppal;
string[] roles;
if (((bool)admin) == true) //出错在这个if语句这
{ //详细错误在代码最后说明
roles = new string[] {"User", "Admin"};
}
else
{
roles = new string[] {"User"};
} ppal = new GenericPrincipal(Context.User.Identity, roles);
Context.User = ppal;
}
else
{ Context.User = null;
}
}
catch
{
throw;
}
finally
{
con.Close();
}
}
假如去掉整个if,只留下roles = new string[] {"User", "Admin"};或者
roles = new string[] {"User"};则程序可正常判断出用户是否是管理员组。
if在时就会出错,错误好像是转换错误什么的。数据库中的是否管理员是用一个
文本字段,0表示不是管理员,1表示是!
问题4:发牢骚,现在的书动不动就省略代码,说是什么限于篇幅,丝毫不知道我这样的新手根本就
不知道他省略的那段代码该怎么写,写书的人觉得显而易见的东西对于我们这些新手来说却
是一点都不简单。 这里结束!谢谢!
<add key="xyzl.ConnectionString" value="Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=Data/xyzl.mdb" />
程序中用ConfigurationSettings.AppSettings["xyzl.ConnectionString"]取得的路径为
f:/windows/system32/inetsrv/xyzl/Data/xyzl.mdb
不是我需要的F:/Inetpub/wwwroot/xyzl/Data/xyzl.mdb
应该怎么样写才能得到我想要的,写绝对路径吗?那我要上传到虚拟主机就会麻烦了,我不知
道虚拟主机上的路径。问题2:sql = "SELECT * FROM Users WHERE Login='{0}' AND Pwd='{1}'";
sql = String.Format(sql,txtLogin.Text,txtPwd.Text());
这样写算不算传参,能不能和SQLSEVER的cmd.Parameters.Add()传参一样防止SQL注入。问题3:为了得到用户权限,在Global的Application_AuthenticateRequest(Object sender,
EventArgs e)中这样写道: HttpApplication app = (HttpApplication)sender;
if (app.Request.IsAuthenticated)
{
OleDbConnection con;
string sql;
OleDbCommand cmd; string id = Context.User.Identity.Name; con = new OleDbConnection(
ConfigurationSettings.AppSettings
["cnFriends.ConnectionString"]); //此处是对的
sql = "SELECT IsAdministrator FROM [User] WHERE UserId='{0}'";
sql = String.Format(sql, id);
cmd = new OleDbCommand(sql, con);
con.Open();
try
{
object admin = cmd.ExecuteScalar(); if (admin != null)
{
GenericPrincipal ppal;
string[] roles;
if (((bool)admin) == true) //出错在这个if语句这
{ //详细错误在代码最后说明
roles = new string[] {"User", "Admin"};
}
else
{
roles = new string[] {"User"};
} ppal = new GenericPrincipal(Context.User.Identity, roles);
Context.User = ppal;
}
else
{ Context.User = null;
}
}
catch
{
throw;
}
finally
{
con.Close();
}
}
假如去掉整个if,只留下roles = new string[] {"User", "Admin"};或者
roles = new string[] {"User"};则程序可正常判断出用户是否是管理员组。
if在时就会出错,错误好像是转换错误什么的。数据库中的是否管理员是用一个
文本字段,0表示不是管理员,1表示是!
问题4:发牢骚,现在的书动不动就省略代码,说是什么限于篇幅,丝毫不知道我这样的新手根本就
不知道他省略的那段代码该怎么写,写书的人觉得显而易见的东西对于我们这些新手来说却
是一点都不简单。 这里结束!谢谢!
connectionstring=String.format("Provider=Microsoft.Jet.OLEDB.4.0;Data
Source={0}",server.MapPath(AppSettings["xyzl.ConnectionString"]))2:sql = "SELECT * FROM Users WHERE Login='{0}' AND Pwd='{1}'";
sql = String.Format(sql,txtLogin.Text,txtPwd.Text());
Sql是一段纯文本,不包含oledbparamter/sqlparameter,不能防止sql注入,比如texLogin.Text可能等于
1' 任一的sql语句 select 1 where 1='
这样sql拼起来也是合法的3:if (((bool)admin) == true) //出错在这个if语句这
{ //详细错误在代码最后说明
roles = new string[] {"User", "Admin"};
}
admin现在是一个object 除了为null外,也可能是dbnull
if(admin==DBNULL.Value){}//先判断
else if((bool)admin){}//再转换4主与你同在,另外MSDN是最好的书
再送我一个问题吧
是不是只有选择语句的时候才会有SQL注入的危险?
比如SELECT * FROM Users WHERE Login='{0}' AND Pwd='{1}'
可以用1' 任一的sql语句 select 1 where 1='1替换{0}
那么结果是
SELECT * FROM Users WHERE Login='1' 任一的sql语句 select 1 where 1='1' AND Pwd='{1}'
和select 有关吗?
但和你的本意有关吗?
这三个语句会不会被注入
需不需要过滤 ' 。
有没有必在过滤!
十分感谢啊!