在预准备语句中使用$ _POST变量

时间:2013-11-03 08:28:56

标签: php mysql pdo sql-injection

我一直在尝试编写预处理语句,并在其中使用$ _POST变量,但我在网上看到的任何内容似乎都无效。我知道问题是为了展示适当的研究,但我找不到任何与网上这个问题相符的内容。请告诉我我做错了什么。

$dbh = new PDO('mysql:host=localhost;dbname=dbname', 'user', 'pass');
$currentdate = date("Y-m-d");
$key = md5(microtime().rand());
try {
  $query = $dbh->prepare("INSERT INTO requests (formname, formemail, formphone, formpostcode, formitem, formnotes, formbudget, formdatefor, currentdate, deletekey, resolved, deleted)
    VALUES (:name, :email, :phone, :postcode, :item, :notes, :budget, :datefor, :curentdate, :key, '0', '0')");

  $params = array_intersect_key($_POST, array('name', 'email', 'phone', 'postcode', 'item', 'notes', 'budget', 'datefor', 'currentdate', 'key'));
  $query->execute($params);
}
catch (PDOException $e) {
  error_log($e->getMessage());
  die("An error occurred, contact the site administrator.");
}

2 个答案:

答案 0 :(得分:2)

$params = array_intersect_key($_POST, array('name', 'email', 'phone', 'postcode', 'item', 'notes', 'budget', 'date for', 'currentdate', 'key'));

右侧的数组包含 012等。$_POST数组有键nameemail等(我假设)。他们的交汇点没什么。 array_intersect_key在两个数组的 上相交,而不是在一个键的键和另一个键的值上相交。

你想:

$params = array_intersect_key($_POST, array_flip(array('name', ...)));
                                      ^^^^^^^^^^

如果您尝试过var_dump($params),那么很容易理解。

你仍然应该在这里进行错误检查,因为没有任何保证$_POST将包含你期望的所有值,在这种情况下你将触发关于缺少参数的PDO错误。

答案 1 :(得分:0)

我相信你的$ _POST数组键中没有任何地方'currentdate','key'。