使用PDO避免sql注入 - 新代码不起作用(新手)

时间:2014-06-28 10:01:09

标签: php sql pdo sql-injection statements

我想使用预准备语句来避免SQL注入。

为了给你一个想法,这是我的旧代码:

<?php
    (connect to database = ok)

    $id = str_replace ('-', ' ', $_GET['id']);

    $sql = "SELECT * FROM `table-news` WHERE `id` = '$id' ORDER BY `date` DESC";
    $result = $conn->query($sql);
    if ($result->num_rows > 0) {
    while($row = $result->fetch_assoc()) {
?>

<div id="content">
    <?php echo strtolower($row['text']);?>
</div>

<?php
    }// end while
    }// end if
    else {
    echo '0 results';
    }// end else
?>

这是迄今为止的新代码:

<?php
    $pdo = new PDO('mysql:host=localhost;dbname=testdb', 'root', '');               
    $id = str_replace ('-', ' ', $_GET['id']);                  
    $sql = "SELECT id, title, year, date, text FROM `table-news` WHERE id= :id ORDER BY `date` DESC";

    $stmt = $pdo->prepare($sql);
    $stmt->bindParam(":id", $id);
    $stmt->execute();

    if($result = $stmt->fetch(PDO::FETCH_ASSOC))
    {
?>

<div id="content">
    <?php echo strtolower($result['text']);?>
</div>

<?php
}// end if
else {
echo '0 results';
}// end else
?>

我(至少)遇到了这个新代码的一个问题:

以下代码不能避免SQL注入。如何使用PDO将其转换为安全代码? (我真的需要用连字符替换所有空格)

`$id = str_replace ('-', ' ', $_GET['id']);`

3 个答案:

答案 0 :(得分:1)

替换此

$stmt->bindParam(":id", $_GET['id']);

$stmt->bindParam(":id", $id);

答案 1 :(得分:0)

您的代码看起来很好,不确定为什么您认为它不会避免注射

摆脱以下几行:

$id = str_replace ('-', ' ', $_GET['id']); 

您无需手动清理参数。这是准备查询的重点。

$id = $_GET['id'];      

$sql = "SELECT id, title, year, date, text FROM `table-news` 
        WHERE id= :id ORDER BY `date` DESC";

$stmt = $pdo->prepare($sql);
$stmt->bindParam(":id", $id);
$stmt->execute();

如果你担心爆炸,那么保持这条线,但是单一的宣传并不像--评论那样双重超级SQL那么危险。

答案 2 :(得分:-2)

要将以下内容更改为mysqli,请参阅此处...

  $sql = "SELECT * FROM `table-news` WHERE `id` = '$id' ORDER BY `date` DESC";
  $result = $conn->query($sql);

要..

//create db connection
  $conn = new mysqli("localhost", "my_user", "my_password", "world");

//create prepared statement
  $statement = $conn->prepare("SELECT * FROM `table-news` WHERE `id` = ? ORDER BY `date` DESC");

//bind parameters
  $statement->bind_param('s', $id);

//execute query
  $statement->execute();

如果您不了解某些内容,请进一步阅读这些组件。他们看起来很奇怪的一点是bind_param&#39;值。这告诉MySQL,param是一个字符串。假设你准备好的语句中有两个&#39;在第一个是整数秒是一个字符串,它看起来像..

 $statement->bind_param('is', $MyInteger, $MyString);