什么是 PDO,它与 SQL 注入有什么关系,为什么要使用它?

Posted

技术标签:

【中文标题】什么是 PDO,它与 SQL 注入有什么关系,为什么要使用它?【英文标题】:What is PDO, how is it related with SQL injection, and why I should use this? 【发布时间】:2014-12-05 05:42:27 【问题描述】:

其实我google了这么多结果,但是看不懂,因为我是这个领域的新手。

那么什么是PDO,我为什么要使用它,什么是SQL注入等有什么简单的方法?1

其实现在我的代码是这样的。

config.php

<?php
    $mysql_hostname = "localhost";
    $mysql_user = "root";
    $mysql_password = "";
    $mysql_database = "testdb";
    $prefix = "";
    $bd = mysql_connect($mysql_hostname, $mysql_user, $mysql_password) or die("Could not connect database");
    mysql_select_db($mysql_database, $bd) or die("Could not select database");
?>

插入.php

<?php
    include('config.php');
    $account_no = $_POST['account_no'];
    $amount = $_POST['amount'];
    $save = mysql_query("INSERT INTO tableamount (account_no, amount) VALUES ('$account_no', '$amount',)");
    header("location: index.html");
    exit();
?>

index.html

<html>
    <body>
        <form action="amount.php" method="post" enctype="multipart/form-data" name="addroom">
            Account Number<br />
            <input name="account_no" type="text"/><br />

            Amount<br />
            <input name="amount" type="text"/><br />

            <input type="submit" name="Submit" value="Submit" id="button1" />
        </form>
    </body>
</html>

【问题讨论】:

【参考方案1】:

PDO - PHP 数据对象 是一个数据库访问层,提供访问多个数据库的统一方法。

它不考虑特定于数据库的语法,但它可以让切换数据库和平台的过程相当轻松,只需在许多情况下切换连接字符串即可。 p>

准备好的语句/参数化查询足以防止对该语句的一阶注入。如果您在应用程序的其他任何地方使用未经检查的动态 SQL,您仍然容易受到二阶注入的攻击。

二阶注入意味着数据在被包含在查询中之前已经在数据库中循环了一次,并且更难实现。 AFAIK,您几乎从未见过真正的二阶攻击,因为通过社交工程通常更容易进入。

PDO 比mysql_* 慢一点。但是它的便携性很好。 PDO 提供跨多个数据库的单一接口。这意味着您可以使用多个数据库,而无需对 mysql 使用 mysql_query,对 SQL Server 使用 mssql_query 等。只需始终使用 $db-&gt;query("INSERT INTO...") 之类的东西。无论您使用什么数据库驱动程序。

因此,对于较大或可移植的项目,PDO 更可取。甚至 Zend Framework 也使用 PDO。


SQL 注入

SQL 注入

SQL 注入是一种恶意用户可以通过网页输入将 SQL 命令注入 SQL 语句的技术。

注入的 SQL 命令可能会改变 SQL 语句并危及 Web 应用程序的安全性。


PDO 准备好的语句是否足以防止 SQL 注入?

简短的回答是否, PDO 准备将不会保护您免受所有可能的 SQL 注入攻击。 攻击example


如何使用 PDO?

一个例子:

$stmt = $dbh->prepare("SELECT * FROM tables WHERE names = :name");
$stmt->execute(array(':name' => $name));

参考文献

http://code.tutsplus.com/tutorials/pdo-vs-mysqli-which-should-you-use--net-24059 http://code.tutsplus.com/tutorials/why-you-should-be-using-phps-pdo-for-database-access--net-12059 Are PDO prepared statements sufficient to prevent SQL injection? http://php.net/manual/en/book.pdo.php

【讨论】:

+1 用于二阶攻击,但请修复 注入,错字会伤害我的眼睛,否则很好回答 :)【参考方案2】:

想象一下这个用户输入:"1'); TRUNCATE TABLE accounts; --",用你的语句,如果用户知道你有什么 db 结构,可以很容易地从 db 中删除所有内容(假设 db 用户有授权。

永远不要像你所做的那样直接在 sql 查询中使用用户输入,在使用前始终进行转义/强制转换。

PDO - PHP 数据对象 - 是一个数据库访问层,提供访问多个数据库的统一方法。

它不考虑特定于数据库的语法,但可以让切换数据库和平台的过程相当轻松,只需在许多情况下切换连接字符串即可。

请仔细阅读this link,它解释了为什么要在php中使用pdo

【讨论】:

以上是关于什么是 PDO,它与 SQL 注入有什么关系,为什么要使用它?的主要内容,如果未能解决你的问题,请参考以下文章

记录一下学习PDO技术防范SQL注入的方法

mysql注入问题

防止 SQL 注入 - PDO,mysqli [重复]

PDO - 真实的事实和最佳实践? [关闭]

php如何防止sql注入

PDO(预编译参数化查询)和安全问题