问题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:发牢骚,现在的书动不动就省略代码,说是什么限于篇幅,丝毫不知道我这样的新手根本就
       不知道他省略的那段代码该怎么写,写书的人觉得显而易见的东西对于我们这些新手来说却
       是一点都不简单。        这里结束!谢谢!

解决方案 »

  1.   

    1: web.config:<add key="xyzl.ConnectionString" value="Data/xyzl.mdb" />
    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是最好的书
      

  2.   

    楼上的大哥
    再送我一个问题吧
    是不是只有选择语句的时候才会有SQL注入的危险?
      

  3.   

    不仅仅只是select 其它的语句是一样的
    比如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 有关吗?
    但和你的本意有关吗?
      

  4.   

    我是想说INSERT,UPDATE,DELETE语句用不用用参数,
    这三个语句会不会被注入
    需不需要过滤 ' 。
    有没有必在过滤!
    十分感谢啊!
      

  5.   

    问题1:Source单独列出来,写相对于虚拟目录的相对路径,然后用Server.mappath()转换为绝对路径,再组合,虽然比你做的稍为麻烦,但以后不管装到哪个服务器上,都不用改源码了