首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在数据库中插入包含MySQL和Java双引号的刮过的页面

在数据库中插入包含MySQL和Java双引号的刮过的页面
EN

Stack Overflow用户
提问于 2013-09-22 07:44:32
回答 2查看 486关注 0票数 0

想象一下,我的页面有一堆类似于这样(示例页)的部分:

代码语言:javascript
运行
复制
  <div class="content">
    </div>

我的目标是将整个页面抓取到一个MySQL DB条目中。我现在这样做:

代码语言:javascript
运行
复制
        //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),并仅将相关数据保存到DB中。

我意识到在防止SQL注入方面也有最佳实践。然而,这是一个独立的系统,所以暂时不是一个问题。话虽如此,如果有任何答案可以解释如何防止这种情况,我宁愿执行。

编辑1:从@chrylis评论开始。这就是我所拥有的:

代码语言:javascript
运行
复制
    //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);

但是,它提供了此错误:

代码语言:javascript
运行
复制
Parameter index out of range (5 > number of parameters, which is 4).

编辑2:

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

代码语言:javascript
运行
复制
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 = ?))";
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-22 07:49:50

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

票数 2
EN

Stack Overflow用户

发布于 2013-09-22 07:50:00

这不仅是一个糟糕的实践,因为SQL注入,它也是缓慢和低效的,并有引号字符的问题。使用参数化查询。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18941536

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档