SQL注入新手(错误)

时间:2013-07-29 19:12:10

标签: php sql pdo sql-injection

我被建议使用反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

1 个答案:

答案 0 :(得分:2)

您的代码中的一个大问题是它使用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'的方法相关联。