public class Class1
{
   public Class1()
   {
   //
   //TODO: 在此处添加构造函数逻辑
   //
   }
   //拼接查询字符转
   string sqlstr(string tbname)
   {
   string str="select * from "+tbname +" where id=@id";
   return str;
   }
    //查询
   public DataTable ss(int id)
   {
   string str=sqlstr("Mytab");   SqlParameter [] par=
   {
   new SqlParameter("@id",SqlDbType.Int)
   };
   par[0].Value=id;
   DataTable dt= sqlhp.ex(str);
   }}
请问如果我在页面中调用这个类是否有被注入的危险。
其中拼接字符串sqlstr(string tbname)
这个方法是私有的。
调用返回datatable的方法才是公共的!

解决方案 »

  1.   

    取决于你的tbname  从哪儿来注入攻击就是用户输入的文本把你的sql注释掉,如果tbname 为用户输直接入文本就有危险,如果是你自己定义的常量 还好
      

  2.   

    tbname如果是来自用户输入,就会被SQL注入;如果仅是程序内部使用,则不会被注入。这根public还是private没有关系。
      

  3.   

    如果tbname是用户输入,可以对其验证看是否为合法的数据表名字,这样就可避免注入了。
      

  4.   

    额。如果我用这个类,在其他页面调用的时候肯定是只能调用public的方法肯定不能调用private的方法吧!如果是只能调用public 的方法那你就没办法注入了吧!你看public的方法。
      

  5.   

    注不注入取决于你所能传进的参数,数据你传的都是数值,那当然没办法注入,如果你传入的是字符串,且是用于拼接SQL字符串,那就很难说了
      

  6.   

    使用参数化很累吗??怕累就别怕sql注入
      

  7.   

    sql注入的原理是
    根据用户的输入去构造sql语句
    在没有预防措施的情况下,用户输入的值包含能改变你设置的sql语句的本意,即是sql注入
    方法的访问权限和这个毫无关系,只看传入参数(一般是字符串)的处理
    比如毫无预防的接受一个字符串,用户输入了两个减号(sql里的注释符号)
    那你的sql,在这个字符串后面部分就全失效了
    访问权限是你自己写程序的时候调用方法的问题,和sql注入没有半毛钱关系,注入的只需要构造合适的参数,影响的是最终的sql 语句,根本不关心方法调用.
      

  8.   


    public class Class1
    {
       public Class1()
       {
       //
       //TODO: 在此处添加构造函数逻辑
       //
       }
       //拼接查询字符转
       string sqlstr(string tbname)
       {
       string str="select * from "+tbname +" where id=@id";
       return str;
       }
        //查询
       public DataTable ss(int id)
       {
       string str=sqlstr("Mytab");   SqlParameter [] par=
       {
       new SqlParameter("@id",SqlDbType.Int)
       };
       par[0].Value=id;
       DataTable dt= sqlhp.ex(str);
       }}如果楼主只是提供这个类编译成DLL的话,如果在A。aspx要返回数据库中B表的数据,那么肯定是这么调用的
    class1 c=new class1();
    c. ss(1);
    肯定是这么调用的在这个调用中
     //拼接查询字符转
       string sqlstr(string tbname)
       {
       string str="select * from "+tbname +" where id=@id";
       return str;
       }
    拼接字符串 tbname 这个不是用户输入的而是在  //查询
       public DataTable ss(int id)
       {
       string str=sqlstr("Mytab");。}这个方法中输入的固定参数
    而楼主id 是通过@id参数输入的
    用户输入的就只有id这个参数 所以 只要@id是参数化查询的话那么不纯在注入攻击方法,