【问题标题】:How can I escape URL parameter for using it into the query?如何转义 URL 参数以将其用于查询?
【发布时间】:2017-11-13 06:17:20
【问题描述】:

我有一个生成查询的函数。像这样的:

// this is a simplified version of my real code
public function get_query(){
    $name = $_GET['name'];
    return "SELECT * FROM mytable WHERE name = $name";
}

如您所知,此类查询并不安全。因为他们受到 SQL 注入的威胁。无论如何,在将其用于查询之前,我需要 escape $name 变量。

嗯,有两种方法:(因为我使用 PDO。否则还有一种旧方法是使用 mysql_escape_string()

  1. 使用PDO::prepare()
  2. 使用PDO::quote()

它们都需要 PDO 连接,它不能访问生成器查询功能。现在我想知道,还有其他方法吗?

【问题讨论】:

  • 使用 pdo 你可以使用 param ..
  • @scaisEdge 我不想在查询中传递?:param 之类的参数。我只想将查询作为字符串。
  • 如果你有 PDO 使用它...
  • 没有数据库连接就不可能安全地转义字符串。

标签: php mysql security pdo


【解决方案1】:

是的。您可以让函数返回稍后将与 PDO 一起使用的内容。既然您说它在生成时不可用,请事先执行所需的任何步骤,然后使用 PDO,因为好吧,您必须花一些时间。

如果 PDO 不可用

public function get_query(){
    $name = $_GET['name'];
    return array(
        'query' => 'SELECT * FROM mytable WHERE name = :name',
        'params' => array(':name', $name)
    );
}

PDO可用

// pass '$values' to a class where a connection is available
$values = get_query();
$pdo->prepare($values['query']); // $pdo->prepare('SELECT * FROM mytable WHERE name = :name');
$pdo->execute($values['params']); // $pdo->execute(array(':name', value_of_$name));

它看起来像Second Example from the Manual。即使不知道正在使用什么查询/参数,它仍允许您使用准备好的语句和参数化查询。


一些注意事项:

  • Escaping is not enoughprevent sql injection
  • 这不会改变您最初的想法,因为您仍会将从get_query() 返回的生成查询传递给 PDO;
  • 如果您的查询生成过于复杂,您可以在查询中使用 ? 作为未命名的参数 - 类似于手册中的示例 3 - 只要这些值以正确的顺序传递。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-22
    • 2017-02-24
    • 1970-01-01
    • 2013-10-21
    • 1970-01-01
    • 2017-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多