【问题标题】:Insert values with single quotation in PostgreSQL在 PostgreSQL 中插入带单引号的值
【发布时间】:2012-08-05 04:20:37
【问题描述】:

我想使用单引号值运行以下查询。

INSERT INTO web_camp_keywords (web_id, keyword) VALUES (195, 'abc'hotels')

我只想添加abc'hotels 值。我使用了反斜杠,但它不起作用。

INSERT INTO web_camp_keywords (web_id, keyword) VALUES (195, 'abc\'hotels')

我该如何解决这个问题?

【问题讨论】:

  • 尝试 INSERT INTO web_camp_keywords (web_id, keyword) VALUES (195, 'abc''hotels') 。但为什么不准备好声明?
  • tnx.我对准备好的陈述没有经验。我会试试的。
  • @Asurya 那么你的应用程序充满了所谓的 SQL 注入安全漏洞。想象一下,如果在表单中输入 abc'hotels 的用户改为输入 abc'; DELETE FROM web_camp_keywords;-- 或更糟的是 abc';DROP SCHEMA public CASCADE;-- 会发生什么? splat,你的整个数据库就到这里了。请参阅en.wikipedia.org/wiki/SQL_injection注意:如果您的应用程序仅使用最低要求的权限进行连接,DROP SCHEMA 技巧将不起作用 - 它不应该拥有表或成为超级用户 - 但您的应用程序可能是表格。)

标签: php sql postgresql


【解决方案1】:

你可以用另一个单引号转义单引号。

INSERT INTO web_camp_keywords (web_id, keyword) 
VALUES (195, 'abc''hotels')

但我个人认为你应该使用prepared statements with bind parameters

除其他外,使用带有绑定参数的准备好的语句是帮助防止SQL injection(Web 应用程序中最大的安全漏洞来源)的最简单方法之一。

【讨论】:

    【解决方案2】:

    就像 Chris Moutray 和其他人提到的那样,最好使用 pdo 和准备好的语句。这是一个关于如何准备语句、为语句提供值然后执行它的示例。我忽略了连接。

    $statement = $pdo->prepare("insert into web_camp_keywords (web_id, keyword) values (:id, :keyword)");
    $statement->bindValue(':id', 195);
    $statement->bindValue(':keyword', "abc'hotels");
    $statement->execute();
    

    【讨论】:

      猜你喜欢
      • 2012-09-01
      • 2019-02-15
      • 2010-10-31
      • 2020-04-27
      • 1970-01-01
      • 1970-01-01
      • 2019-07-20
      • 2014-11-09
      相关资源
      最近更新 更多