【问题标题】:String seems to end query字符串似乎结束了查询
【发布时间】:2013-05-22 12:28:36
【问题描述】:

我将来自 facebook 的用户喜欢的页面存储在我的 postgres 数据库中,其中之一是 Sinead O'Connor 的页面。似乎当它到达撇号时,它终止了查询,因为撇号匹配,因此导致错误:

  $json_likes=json_encode($likes);
  echo $json_likes;
  $query = "UPDATE public.account_recover_users SET user_likes='$json_likes' WHERE user_mail='$email'";
  $result = pg_query($query);
  if(!$result)
      exit('{ "status": false }');
  else exit('{ "status": true }');

现在我得到的是:

Warning: pg_query() [<a href='function.pg-query'>function.pg-query</a>]: Query failed: ERROR: syntax error at or near &quot;Connor&quot; LINE 1: ...l&quot;,&quot;page_id&quot;:&quot;243440865683470&quot;},{&quot;name&quot;:&quot;Sinead O'Connor&quot;,&quot;p... 

知道我应该如何处理这个问题吗?我的应用的用户在他们喜欢的页面中可能有各种各样的字符。

【问题讨论】:

  • 知道我应该如何处理这个问题吗?使用参数化查询或继续遭受这样的情况。 Here's how PDO 或 mysqli over mySQL(已弃用)
  • 参数化查询或清理输入。 不要保持原样。
  • 我对数据库和 webdev 完全陌生,抱歉。谢谢你
  • 第二。 @LoztInSpace 是对的。在没有 SQL 注入知识的情况下使用数据库就像在没有任何爆破训练的情况下在反炸弹小组中工作。
  • @LoztInSpace 我没有老板(还),我只是在一个团队中工作,为了学习目的——暂时。但我们也在努力将我们的学习过程变成产品或其他东西。谢谢

标签: php sql database postgresql


【解决方案1】:

很高兴您没有尝试存储Bobby Tables 的页面。您的应用容易受到SQL Injection 的攻击 - 为了您自己的利益,请避开撇号。

TL;DR:您附加的文本中的撇号与您的应用程序中硬编码的撇号相匹配,导致 SQL 命令格式错误。因此出现错误。

编辑:将这个从 cmets 移到这里。这里是a good guide on how to prevent SQL Injection in PHP

【讨论】:

【解决方案2】:

您在 json 字符串中有单引号,它会中断查询。至少使用addslashes($json_likes)addslashes($email)

【讨论】:

  • 不,使用pg_espace_stringaddslashes 是不够的,并且在反斜杠是普通字符的现代 PostgreSQL 中根本不起作用。甚至在its doc 中也提到过,引用:强烈建议使用 DBMS 特定的转义函数(例如 MySQL 的 mysqli_real_escape_string() 或 PostgreSQL 的 pg_escape_string())
  • 不,这只是围绕问题。正确使用参数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-06
  • 1970-01-01
  • 2010-12-01
  • 2013-10-26
  • 1970-01-01
相关资源
最近更新 更多