科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道应用软件求教【SQL注入】问题

求教【SQL注入】问题

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

求教【SQL注入】问题

作者:csdn 来源:csdn 2009年12月14日

关键字: 问答 ASP.NET

  • 评论
  • 分享微博
  • 分享邮件

 求教【SQL注入】问题

经常看到有大侠为了防止SQL注入,替换敏感关键字符的做法(参数化除外。),我一直不解。 因为我一般都是: xx.replace("'","''"); 即单引号替换为两个单引号,就没事了。但是刚百度了一下,发现很多人都是除了替换单引号之外,还要替换 insert..update..delete 等等各种数据库关键字。我不知道防止这些关键词儿的兄弟们有没有亲自测试过。但我测试的结果,只要不输入奇数倍数的单引号,随你怎么输入,都没问题。insert..update..delete等等,这些词儿,我随意输入,都没事。我在想,是我测试思路不对?? 还是这些词儿压根儿就没事儿? 请高人给指点下,谢谢。

测试代码如下:(无连接数据库的代码,不过发了也没用)
类文件中


C# code

    public static void Execute(string sql)
    {
        SqlConnection conn = Conn.GetConnection();
        using (conn)
        {
            SqlCommand cmd = new SqlCommand(sql, conn);
            cmd.ExecuteNonQuery();
        }
    }

    public static String getOne(string sql)
    {
        using (SqlConnection conn = Conn.GetConnection())
        {
            SqlCommand cmd = new SqlCommand(sql, conn);
            if (cmd.ExecuteScalar()!=null)
            {
                return cmd.ExecuteScalar().ToString();
            }
            return "xx";
        }
    }

 

前台:


HTML code

<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
        <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" />
&nbsp;<asp:Label ID="Label1" runat="server"></asp:Label>

 


后台:


C# code

    protected void Button1_Click(object sender, EventArgs e)
    {
        /*
         * 增
         * string sql = "insert into test values('"+TextBox1.Text+"')";
         * Common.Execute(sql);
         */

        /*
         * 删
         * string sql = "delete test where name='" + TextBox1.Text + "'";
         * Common.Execute(sql);
         */

        /*
         * 改
         * string sql = "update test set name='" + TextBox1.Text + "'";
         * Common.Execute(sql);
         */

        /*
         * 查
         * string sql = "select top 1 name from test where name='" + TextBox1.Text + "'";
         * Label1.Text=Common.getOne(sql);
         */
    }

 

数据库:


SQL code


create table test
(
name varchar(20)
)

我一向的做法是过滤掉select¦insert¦delete¦update¦declare¦sysobjects¦mid¦master¦syscolumns¦cast¦truncate¦exec这些,然后把一个单引号替换成2个,
但有时候会出问题,比如长篇文章里面有可能命中了比较短的,如mid,cast,exec,master等,如果要求不高可以不过滤这些。
至于unicode编码注入,char(..)什么的,汗,顾不了这么多了。如果真的遇到了也只好认倒霉。。
针对这个:
        /*
        * 删
        * string sql = "delete test where name='" + TextBox1.Text + "'";
        * Common.Execute(sql);
        */
在TextBox1中输入  ';delete test;--
那最后SQL拼接的结果是:delete test where name='';delete test;--'
这样楼主的表里的数据就全玩完了
你可以照这个思路再去想象
如果你的代码写成
string input = TextBox1.Text.replace("'","''");
string sql = "delete test where name='" + input + "'";
exec(sql);
那最后结果变成:delete test where name=''';delete test;--'
这样就不会出现问题
对于替换单引号之后怎么注入,我能力有限,暂时想不出啥办法
 
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章