0

数据库是否仍然容易受到带有准备语句的 SQL 注入的攻击,如下例所示(我使用的是 PDO 和 php 版本 5.3):

  $unsafe = $_POST['user_input'];

  $stmt = $db->prepare("INSERT INTO table (column) VALUES ('" . $unsafe . "')");

这两个例子有什么值得一提的区别吗?

  $stmt = $db->prepare('SELECT * FROM table WHERE name = :name');

  $stmt->execute(array(':name' => $name));

    $stmt = $db->prepare('SELECT * FROM table WHERE name = :name');
    $stmt->bind_param(':name', $name);

    $stmt->execute();

方法执行中可以使用哪些类型的参数?

4

2 回答 2

1

尽管尚不完全清楚您的实际问题是什么,但让我这样说:

您发布的第一个片段是正确的。根本没有一个有效的论据可以让您使用已弃用的扩展(或已弃用的扩展)mysql_*。忘记所有那些讨厌的mysql_connect电话。
看看我猜你正在使用的另外两个片段PDO,它确实支持准备模拟。事实上,它默认模拟prepares。但是,如果第三个片段是一个mysqli_*片段,那么问题是什么?除非你运行的是 MySQL 3.x,否则你就可以了。

模拟准备和直接准备调用之间的区别在于,模拟可能会在不涉及 MySQL 服务器的情况下发现一些语法错误,因此效率更高。但是,如果您的 MySQL 服务器不支持准备好的语句,我很确定PDO会为您解决这个问题,所以您应该没问题。不过不知道mysqli_*。考虑到所有因素,无论如何我都赞成第二个片段。它的代码更少,与第三个片段做同样的事情,并允许代码整洁、易于维护。

关于“方法执行中可以使用哪些类型的参数”的问题,您可以查阅文档页面,如果它没有参数,或者您可以在此处看到PDO的数组: 如果是,这取决于您的使用OO 或程序样式,如文档中所示:for OO for procedural stylebool PDOStatement::execute ([ array $input_parameters ] )
mysqli_execute
bool mysqli_stmt::execute ( void )
bool mysqli_stmt_execute ( mysqli_stmt $stmt )

于 2013-03-15T00:26:55.960 回答
0

数据库是否仍然容易受到使用准备语句的 SQL 注入的影响,如下例所示

为什么?当然。因为在这个例子中没有实际使用准备好的语句。

模拟准备和直接准备调用之间的区别?

在安全性方面没有区别——任何一种方式都是安全的。
但是,可能会有如下所述的不便之处

Errr ...我突然想到,您可能对仿真准备的内容有错误的认识。
您问题中的第一个代码片段根本不是一个准备好的陈述,既不是模拟的也不是自然的 - 而是旧的很好的推断,背后有所有的危险。
虽然模拟准备代表 PDO 操作查询的方式,但在此处解释

方法执行中可以使用哪些类型的参数?

这很明显 - 默认情况下,所有参数都被视为字符串

因此,无论哪种方式,您的查询都是无懈可击的,但如果仿真为 ON,则可能会带来一些不便 - 如果 LIMIT 子句中有占位符,则必须显式绑定参数,而不是将它们传递给执行,为它们设置 INT 类型。
但是如果禁用了仿真,mysql可以对所有参数进行排序,并且可以将数组发送到execute()一路。

于 2013-03-15T04:23:45.837 回答