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

时间:2014-10-10 06:03:58

标签: php mysql pdo sql-injection

其实我确实谷歌得到了很多结果,但我无法理解,因为我是这个领域的新人。

那么什么是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");
?>

insert.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>

2 个答案:

答案 0 :(得分:3)

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

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

Enter image description here

预备语句/参数化查询足以阻止该语句的一阶注入。如果在应用程序的任何其他位置使用未经检查的动态SQL,则仍然容易受到二阶注入的影响。

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

PDO比mysql _ *慢一点。但它具有很好的便携性。 PDO提供跨多个数据库的单一界面。这意味着您可以使用多个数据库,而不使用mysql的mysql_query,SQL Server的mssql_query等。只需使用类似$db->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));

参考

答案 1 :(得分:0)

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

永远不要在sql查询中直接使用用户输入,在使用前始终使用转义/强制转换。

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

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

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