【问题标题】:Variable is not recognisable in single quotes [duplicate]单引号中无法识别变量[重复]
【发布时间】:2017-01-10 18:19:14
【问题描述】:

我有这个 SQL 查询:

mysql_query("INSERT INTO Messages (MessBody,Subject,Date,StaffID,AppID) 
            VALUES ('Your application's status has been changed to ".$_POST['offer']."','Application Status Changed',NOW(),".$_SESSION['StaffUser'].",".$_SESSION['AppID'].")");

变量 $_POST['offer'] 不起作用。我认为这是我在文本中附加它的方式。我尝试了几种不同的方法,但都没有奏效。如果我用文本替换变量,那么记录将被添加到数据库中。

我知道这很愚蠢,但我想不通。老实说,我有点困惑,什么时候使用单引号,什么时候使用双引号,所以这可能是另一个原因,为什么我无法弄清楚。

【问题讨论】:

  • 在字符串中,用另一个单引号转义单引号。例如。 'Your application''s status...'.
  • 在做任何其他事情之前,您应该解决几个主要问题: 1. 不要使用已弃用和不安全 mysql_* -功能。它们自 PHP 5.5 起已弃用,并在 PHP 7 中完全删除。改用 MySQLi 或 PDO。 2. 你对SQL Injections很开放并且应该真正使用Prepared Statements而不是连接你的查询,如果你使用上面提到的MySQLi或PDO就可以使用。
  • 不要使用mysql-functions,它们已被弃用,在 PHP7 中,已删除。请改用mysqliPDO,并使用参数化查询 来保护自己免受SQL 注入(您的代码很容易受到攻击),并防止所有这些讨厌的小问题报价相关的错误...
  • 首先,阅读有关字符串的手册。它解释了单引号和双引号字符串的区别。其次,这段代码很糟糕,会导致灾难。 a) 您正在使用已从当前版本的 PHP 中删除的过时 mysql 接口库,b) 您正在将用户提供的值直接插入到 SQL 字符串中。这将使您的应用程序容易受到 SQL 注入的攻击。
  • 代码中的主要问题是您自己造成的非自愿 SQL 注入。如果你解决了这个问题,你的代码不仅可以工作,而且你也可以安全地被第三方故意注入。

标签: php sql


【解决方案1】:

您在不同的地方缺少单引号。尝试使用以下查询

mysql_query("INSERT INTO Messages (MessBody,Subject,Date,StaffID,AppID) 
        VALUES ('Your application\'s status has been changed to ".mysql_real_escape_string($_POST['offer'])."','Application Status Changed',NOW(),'".mysql_real_escape_string($_SESSION['StaffUser'])."','".mysql_real_escape_string($_SESSION['AppID'])."')");

【讨论】:

  • 这个查询仍然会崩溃($_POST 可以包含任何内容,包括更多的单引号)。而且,老实说,在使用库查询 MySQL 时浪费了这么多精力,这使得查询变得更加困难,这有点自虐。
  • 我已经更新了我的查询并将变量包装在 mysql_real_escape_string 中
  • 仍然是一个不好的例子。 mysql_real_escape_string() 并不像您想象的那么安全。 mysql_*-函数既不安全又不推荐使用,根本不应该使用。
猜你喜欢
  • 2018-08-22
  • 2015-03-08
  • 1970-01-01
  • 1970-01-01
  • 2019-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-02
相关资源
最近更新 更多