【问题标题】:is this a safe way to use SELECT via PDO [duplicate]这是通过 PDO 使用 SELECT 的安全方法吗?
【发布时间】:2012-03-08 21:32:15
【问题描述】:

可能重复:
Best way to stop SQL Injection in PHP
How do I sanitize input with PDO?

我正在通过$_GET 获取一个ID。我刚开始使用 PDO,我不确定这是否安全。显然,下面的代码是使用$_GET 来获取一个id。在将其放入查询之前,我根本没有对其进行消毒。这安全吗?

<?php
if (isset($_GET['id'])) {
$blogid = $_GET['id'];
$post = $dbh->query("SELECT id, title, slug, body, image, author, date, category from   blog WHERE id='$blogid' ORDER BY date DESC");
$row = $post->fetch(); ?>

【问题讨论】:

  • 为什么人们在这个网站上投反对票这么高兴? :) 天啊...

标签: php mysql pdo


【解决方案1】:

在将其放入查询之前,我根本没有对其进行清理

不。一点都不安全。 :)

您要么需要转义它,要么使用准备好的语句。对于 PDO,我会使用准备好的语句:

if (isset($_GET['id']) && is_string($_GET['id'])) {
    $blogid = $_GET['id'];
    $stmt = $dbh->prepare("SELECT id, title, slug, body, image, author, date, category from   blog WHERE id= :id ORDER BY date DESC");
    $stmt->execute(array('id' => $_GET['id']));
    $row = $stmt->fetch();
}

【讨论】:

  • 好的,我误解了 PDO 是如何处理这个问题的。我以为$post = $dbh-&gt;query 会对此进行消毒。
  • 它是如何做到的?那将是一些非常痛苦的字符串操作。 query() 只是将文字查询发送到服务器,而不进行任何类型的处理(基本上)。
  • 不知道,所以才问。
【解决方案2】:

在 SQL 查询中插入变量而不对其进行清理/转义是绝不安全的。

如果你不想自己逃避它,你可以做的是使用prepare 语句和bind 你的参数。

您可以查看 PHP 文档...

关于如何使用 PDO 准备: http://php.net/manual/en/pdo.prepare.php

如何使用参数绑定: http://www.php.net/manual/en/pdostatement.bindparam.php

【讨论】:

    猜你喜欢
    • 2013-09-26
    • 1970-01-01
    • 2012-06-10
    • 2011-04-06
    • 1970-01-01
    • 2013-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多