【问题标题】:Does anyone know the meaning behind this php error message?有谁知道这个 php 错误信息背后的含义?
【发布时间】:2011-04-28 03:56:27
【问题描述】:

解析错误:语法错误,意外的 T_ENCAPSED_AND_WHITESPACE,期望 T_STRING 或 T_VARIABLE 或 T_NUM_STRING 是消息。它来自这行代码:

$query = ("SELECT * 
             FROM users 
            WHERE user_name = $_POST['user_name'] 
                & password = $_POST['password'] 
                & user_type = $_POST['user_type']");

有没有人知道这一切的含义?如果是这样,有谁知道如何处理这个问题?

【问题讨论】:

  • 既然你是新用户,我要指出你的脚本存在SQL注入漏洞。
  • 还有一件事,因为已经涵盖了 SQL 注入 - 请告诉我您没有以明文形式存储密码。

标签: php mysql


【解决方案1】:

用途:

$query = sprintf("SELECT u.* 
                    FROM USERS u
                   WHERE u.user_name = '%s' 
                     AND u.password = '%s' 
                     AND u.user_type = '%s' ",
                   mysql_real_escape_string($_POST['user_name']),
                   mysql_real_escape_string($_POST['password']),
                   mysql_real_escape_string($_POST['user_type']) );

$result = mysql_query($query);

参考

【讨论】:

    【解决方案2】:

    你不能像这样插入$_POST。您需要用大括号({ 和})将它们包裹起来。当已经在这样的字符串中时,您也不需要引用键名。

    您还应该引用这些值,并将& 与AND 交换。

    最后你还需要一个;。

    你也不需要用括号括起来。

    $query = "SELECT * 
             FROM users 
            WHERE user_name = '{$_POST[user_name]}' 
              AND password = '{$_POST[password]}' 
              AND user_type = '{$_POST[user_type]}'";
    

    但是...

    ...不要像那样直接插入用户输入。使用转义机制。

    $username = mysql_real_escape_string($_POST['username']);
    $password = mysql_real_escape_string($_POST['password']);
    $user_type = mysql_real_escape_string($_POST['user_type']);
    
    
    $query = "SELECT * 
             FROM users 
            WHERE user_name = '$username' 
              AND password = '$password' 
              AND user_type = '$user_type'";
    

    我建议使用PDO 和绑定参数,而不是自己构建 SQL。

    此外,您的用户输入的密码似乎被直接用于在数据库中进行比较。使用某种形式的单向消息摘要,例如bcrypt。

    【讨论】:

    • 哦,酷。你的意思是这样吗?:“SELECT username FROM users WHERE email={$_POST['email']}”?
    • 我质疑为什么您建议使用转义机制,但仍然提供将用户输入直接扔到查询中的代码。
    • 很高兴看到 - 另外,感谢您对密码存储的评论。
    【解决方案3】:

    要将一维数组值插入字符串,请使用以下语法:

    "foo = $_POST[bar]"
    

    注意没有引号。

    对于插入嵌套数组或通常使用正常语法,请使用大括号:

    "foo = {$_POST['bar']}"
    

    尽管对 SQL 查询执行任何此类操作,但您需要在将值插入查询之前转义值。所以,这样做:

    $query = sprintf('SELECT foo FROM bar WHERE baz = "%s"',
                     mysql_real_escape_string($_POST['baz']));
    

    【讨论】:

      【解决方案4】:

      确保考虑到 SQL 注入。

      试试:

      $username = mysql_real_escape_string($_POST["user_username"]);
      $password = mysql_real_escape_string($_POST["user_password"]);
      $type = mysql_real_escape_string($_POST["uesr_type"]);
      $query = "SELECT * FROM users WHERE user_name='$username' AND password='$password' AND 
       user_type='$type'";
      
      $result = mysql_query($query);
      

      【讨论】:

        【解决方案5】:

        我还建议稍微阅读一下手册:http://us.php.net/manual/de/language.types.string.php#language.types.string.parsing。该链接将向您解释 PHP 如何解析字符串中的变量。

        【讨论】:

          【解决方案6】:
          $username = mysql_real_escape_string($_POST["user_username"]);
          $password = mysql_real_escape_string($_POST["user_password"]);
          $type = mysql_real_escape_string($_POST["user_type"]);
          
          mysql_query("SELECT * FROM users WHERE user_name='$username' AND user_password='$password' AND user_type='$type' LIMIT 1");
          

          【讨论】:

          • 呃...user_password=' OR 1 = 1 --。小心你在这里推荐的东西。
          • user_password 拼写错误,但没有得到 OR 1 == 1 的东西?
          • SQL 注入。如果您将其用于身份验证,我可以完全绕过您的机制。
          • 还是一头雾水 - 你能告诉我查询的样子吗?
          • 大声笑,他说他可以通过简单的查询来 pwn 你的盒子,因为你没有考虑 SQL 注入。
          猜你喜欢
          • 2021-07-20
          • 2011-08-15
          • 1970-01-01
          • 1970-01-01
          • 2013-09-24
          • 2015-05-06
          • 1970-01-01
          • 1970-01-01
          • 2021-07-19
          相关资源
          最近更新 更多