将包含MySQL和Java双引号的已删除页面插入数据库

时间:2013-09-22 07:44:33

标签: java mysql

想象一下,我的页面有很多部分看起来像这样(example page):

  <div class="content">
    </div>

我的目标是将整个页面划分为MySQL DB条目。我目前这样做:

        //Declare SQL statement
    String sql = "INSERT into rns " + 
            "(rns_pub_date, rns_headline, rns_link, rns_fulltext, constituent_id) values (\""+
            rns.getRnsPubDate() + "\",\"" +
            rns.getRnsHeadline() + "\",\"" +
            rns.getRnsLink() + "\",\"" +
            rns.getRnsFullText() + "\",\"" +
            "(select constituent_id from constituent where constituent_name = " + rns.getRnsConstituentName() + "\")";



    //SQL Statement Debug
    Log.d(CLASS_NAME, "createRns. sqlStatement: " + sql);


    //Initialize insertValues
    insertValues = connect.prepareStatement(sql);

但是,由于页面中有多个“标记”,因此会失败。

我可以看到一些选项:

  1. 逃离这样的字符:' \“'
  2. 将字符替换为:''
  3. 删除所有不相关的数据(HTML)并仅将相关数据保存到数据库
  4. 我意识到在防止SQL注入方面也有最好的做法。然而,这是一个独立的系统,所以暂时不是问题。话虽如此,如果有任何答案可以解释如何防止这种情况,我宁愿实施它。

    编辑1: 继@chrylis评论之后。这就是我所拥有的:

        //Insert values into variables
        String rns_pub_date = rns.getRnsPubDate();
        String rns_headline = rns.getRnsHeadline();
        String rns_link = rns.getRnsLink();
        String rns_fulltext = rns.getRnsFullText();
        String rns_constituent_name = rns.getRnsConstituentName();
    
        //Prepare the SQL string
        String sql = "INSERT into rns (rns_pub_date, rns_headline, rns_link, rns_fulltext,constituent_id) VALUES" + "(?,?,?,?,(select constituent_id from constituent where constituent_name = \"" + rns.getRnsConstituentName() + "\")";
    
        //Prepare the statement
        PreparedStatement prest = connect.prepareStatement(sql);
        prest.setString(1, rns_pub_date);
        prest.setString(2, rns_headline);
        prest.setString(3, rns_link);
        prest.setString(4, rns_fulltext);
        prest.setString(5, rns_constituent_name);
    

    但是它提供了这个错误:

    Parameter index out of range (5 > number of parameters, which is 4).
    

    编辑2:

    通过删除第5个参数的转义双引号来修复插入:

    String sql = "INSERT into rns (rns_pub_date, rns_headline, rns_link, rns_fulltext, constituent_id) VALUES" + "(?,?,?,?,(select constituent_id from constituent where constituent_name = ?))";
    

2 个答案:

答案 0 :(得分:2)

使用PreparedStatement,不需要转义。用法示例在API

答案 1 :(得分:2)

由于SQL注入,这不仅是一种不好的做法,而且速度慢且效率低,而且引号字符也存在问题。使用参数化查询。