【问题标题】:Error after selecting data from database [duplicate]从数据库中选择数据后出错[重复]
【发布时间】:2018-07-03 08:15:40
【问题描述】:

我目前正在开发一个带有投票系统的论坛网站。然而,有一些烦人的,可能是语法错误困扰着我。我说的是这段代码。

<?php
session_start();

include_once 'dbh_discussion.inc.php';
$conn = db_discussion_connect();

$thread_id = $_POST['upvote'];

$sql1 = $conn->prepare("SELECT * FROM users WHERE user_id = '$_SESSION['u_id']' AND thread_id = '$thread_id'");

这段代码中不清楚的地方如下:

  • db_discussion_connect() 在 dbh_discussion_connect.inc.php 中声明的函数。此函数返回一个连接到我的数据库的新 PDO。
  • 索引“upvote”是另一个 php 文件中将调用上述代码的按钮的名称。
  • $_SESSION['u_id'] 是一个会话变量,将在用户登录网站时分配。

我在服务器上调试时遇到的错误:

解析错误:语法错误,意外'' (T_ENCAPSED_AND_WHITESPACE), 期望 '-' 或标识符 (T_STRING) 或变量 (T_VARIABLE) 或 /var/www/html/includes/thread_upvotes.inc.php 中的数字 (T_NUM_STRING) 在第 9 行

我觉得我错过了一些语法。无论如何,我非常感谢有人告诉我这里出了什么问题。

谢谢

【问题讨论】:

  • 第9行是哪一行?
  • 请访问bobby-tables.com,了解SQL注入以及如何使用预处理语句。现在你的代码真的很容易被注入,你的整个数据库可能会在几秒钟内被黑客入侵!!!
  • 还要注意,您的代码对 SQL 注入是开放的,因此请为更多错误和问题做好准备。
  • 如果您打算将变量转储到相同的位置,那么准备语句没有多大意义。
  • @WillemvanderSpek - 这就是精神 :D 是的,你应该 ;)

标签: php mysql pdo


【解决方案1】:

你的代码有错误,具体是代码user_id = '$_SESSION['u_id']',试试这个:

 $sql1 = $conn->prepare("SELECT * FROM users 
 WHERE user_id = '{$_SESSION['u_id']}' AND thread_id = '$thread_id'");

要在字符串中插入数组键,如果在' ' 中指定键,则必须将其括在{ }

警告在查询中直接插入$_SESSION 内容,您将有资格获得SQL Injection!!!

插入它们的正确和更好的方法是像这样绑定每个:

$sql1 = $conn->prepare("SELECT * FROM tableName WHERE fieldID = :id");
$sql1->bindParam(':id', $_SESSION["id"]);

【讨论】:

  • ...或绑定参数!
  • 当然,这是真的
  • 请考虑删除/编辑您的答案,以告知读者这将为他们的应用程序/网站/服务器添加一个众所周知的安全漏洞!!!这个问题有正确和安全的答案,你的答案是让读者可以 100% 被黑客攻击!!!!!!!
  • 安全不是 100%...反正我插入了警告。
  • @user2342558 谢谢,伙计 :) 抱歉,重播晚了...
【解决方案2】:

这些人提供的答案仍然对注射持开放态度,这让我非常激动。把他准备好的声明改成安全的有那么难吗?!!!

这里有一个正确的预处理语句的解决方案。好像重写它需要那么长时间。这应该是违反这里的规则的。

<?php
session_start();

include_once 'dbh_discussion.inc.php';
$conn = db_discussion_connect();

$sql1 = $conn->prepare("SELECT * FROM users WHERE user_id = :uid AND thread_id = :tid");
$sql1->bindParam(':uid', $_SESSION["u_id"]);
$sql1->bindParam(':tid', $_POST['upvote']);
$sql1->execute();

【讨论】:

  • bindParam 代替 bindValue 有什么原因吗??
  • php.net/manual/en/pdostatement.bindparam.php Unlike PDOStatement::bindValue(), the variable is bound as a reference and will only be evaluated at the time that PDOStatement::execute() is called. 希望有帮助。如果您还有更多问题,请随时提问:)
【解决方案3】:

好像引用了问题,试试下面,

$uid = $_SESSION['u_id'];
$sql1 = $conn->prepare("SELECT * FROM users WHERE user_id = '$uid' AND thread_id = '$thread_id'");

【讨论】:

  • 可爱的是每个人仍然提供不安全的答案。神圣的。
  • ...或绑定参数!
  • @CD001 你可以省略 :-)
  • @CD001 我不明白人们怎么还能提供这样的例子......问题是,99 % 在这里提问的人根本不关心如何编写正确的准备好的语句,因为它们的代码示例很糟糕 - 但它确实有效。所以他们不在乎。提供这样的例子应该是违反规则的。注射是一个如此大的问题,预防它们很容易。坦克你提到他们需要绑定参数的答案,至少还有一些人理解它! :)
  • 请考虑删除/编辑您的答案,以告知读者这将为他们的应用程序/网站/服务器添加一个众所周知的安全漏洞!!!这个问题给出了正确且安全的答案,你的答案是让读者可以 100% 破解!!!!!!
猜你喜欢
  • 2014-08-26
  • 1970-01-01
  • 2012-03-15
  • 1970-01-01
  • 2014-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-31
相关资源
最近更新 更多