我正在尝试从mySQL数据库中选择数据,
我执行以下代码:
<?php $_SESSION["dog_park"] = $_GET['keyword'] ?>
<div class="review"> <!-- Creating a div with the class 'review -->
<!-- but POST varibale in here for dog park name -->
<h1><?php echo $_SESSION["dog_park"]; ?></h1>
<table border="1" cellspacing="5" cellpadding="5" width="100%">
<thead>
<tr>
<th>Park Name</th>
<th>Street</th>
<th>Suburb</th>
<th>Dog Park Area (m2)</th>
</tr>
</thead>
<tbody>
<?php
$result = $conn->prepare("SELECT * FROM dog_parks.items where suburb = '$_SESSION[dog_park]'");
$result->execute();
for($i=0; $row = $result->fetch(); $i++){
?>
<tr>
<td><label><?php echo $row['Park_Name']; ?></label></td>
<td><label><?php echo $row['Street']; ?></label></td>
<td><label><?php echo $row['Suburb']; ?></label></td>
<td><label><?php echo $row['Dog_Park_Area_(m2)']; ?></label></td>
</tr>
<?php } ?>
</tbody>
</table>
它与会话变量有关,如果我输入mySQL查询的静态值,它将正确显示表数据,但是当$ _SESSION变量存在时失败。
答案 0 :(得分:0)
该字符串包含引号,会破坏您的SQL字符串封装。使用准备好的语句,因为它们应该被参数化,问题就会消失。
$result = $conn->prepare("SELECT * FROM dog_parks.items where suburb = ?");
$result->execute(array($_SESSION[dog_park]));
您可以阅读更多内容:
http://php.net/manual/en/pdo.prepared-statements.php
How can I prevent SQL injection in PHP?
您的查询运行方式如下:
SELECT * FROM dog_parks.items where suburb =&#39;&#39; Tramway&#39;&#39;
(粗略地说,如果您包含错误消息的文本,而不是图像我可以提供真实的查询)
哪个是无效的,因为''
就是您要比较的内容。 Tramway''
它不知道该怎么做。巧合的是SQL注入的发生方式。