我想使用预准备语句来避免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']);`
答案 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);