【问题标题】:New to SQL Injections (error) [closed]SQL注入的新手(错误)[关闭]
【发布时间】:2013-07-29 19:12:09
【问题描述】:

我被建议使用反 sql 注入方法,因为我在我的数据库中插入值。我浏览了网络,我的第一次失败尝试是这个,我需要一些帮助,使用 PDO 方法。我发现网上的例子太空洞了,我无法理解(顺便说一句,我跑了一条线,它告诉我 PDO 已启用):

这在任何方面、形状或形式上都好吗?

<?php
include ('config.php');
// Host, User, Pass, DB
$con=mysqli_connect("127.0.0.1","*****","*****","*****");

// Check connection
if (mysqli_connect_errno())
  {
  echo "Failed to connect to MySQLi: " . mysqli_connect_error();
  }

$host = 'localhost';
$dbname = '****';
$user = '****';
$pass = '*****';

try {
  # MS SQL Server and Sybase with PDO_DBLIB
  $DBH = new PDO("mssql:host=$host;dbname=$dbname, $user, $pass");
  $DBH = new PDO("sybase:host=$host;dbname=$dbname, $user, $pass");

  # MySQL with PDO_MYSQL
  $DBH = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);

  # SQLite Database
  $DBH = new PDO("sqlite:my/database/path/database.db");
}
catch(PDOException $e) {
    echo $e->getMessage();
}  

另外,我在提交表单时收到此错误:

Fatal error: Call to a member function prepare() on a non-object in /home/product/*****/*****/*****/processForm-test.php on line 68

【问题讨论】:

  • 不能混搭Mysqli和PDO。使用其中之一,但不能同时使用。
  • 您的代码不包含对prepare() 方法的任何调用。
  • 您的代码对于回答您的问题基本上没有用,因为您没有显示您实际运行查询的方式。在现实世界中,你问的是汽车后视镜上的模糊骰子是否会让你成为一名优秀的司机。
  • 如果您对 mysqli 还没有走得太远,我会强烈建议切换到 pdo。它更便携且具有更多功能,而 mysqli 更受限制,(可以说)更难使用,并且仅适用于 php。对于几乎任何项目,绝对没有充分的理由使用 mysqli 而不是 pdo。
  • 哦。在那种情况下,绝对不要切换(不值得你花时间!)。如果你还没有准备好,就开始使用准备好的语句(谷歌“mysqli准备好的语句”;有很多例子)。这就是你需要做的。

标签: php sql pdo sql-injection


【解决方案1】:

您的代码中的一个大问题是它同时使用mysqli_connectPDO 来创建数据库连接。不要那样做;不支持。使用其中一种。

建立 PDO 连接的行尝试连接到四个独立的数据库,SQL Server、Sybase、MySQL 和 SQLLite,它们都在 localhost 上运行。但是您只保留最后一个句柄,因为您将数据库连接分配给同一个变量。

如果连接成功,变量$DBH 是您对数据库会话(连接)的引用。如果未成功,则会为其分配一个值 false,您可以在继续之前对其进行测试。

我认为您只需要一个与 MySQL 的 PDO 连接,如下所示:

<?php
include ('config.php');

$host = 'localhost';
$dbname = '****';
$user = '****';
$pass = '*****';
try {
  # MySQL with PDO_MYSQL
  $DBH = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
}
catch(PDOException $e) {
  echo "Connect failed: " . $e->getMessage();
}

我在这里进行推断,但您收到的错误消息最可能的解释是您有一行代码(未在您的代码示例中显示),如下所示:

$sth = $DBH->prepare($sql);

问题在于$DBH 不是对有效数据库连接的引用。 $DBH 的值为“false”,这是因为尝试连接数据库失败。而false 不是一个对象,所以它不可能有一个名为 'prepare' 的方法与之关联。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-29
    • 2022-12-22
    • 2013-09-16
    • 2016-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-25
    相关资源
    最近更新 更多