1

您好我正在尝试通过将变量名称附加到如下 URL 来显示数据库中的特定条目:

echo '<td><a class="index_table" href="includes/view.php?id=$row[id]>$row[Orderno]">

然后在我的 view.php 中我有:

<?php
include 'connect.php';
//Display the Data//
$id=$_GET['id']; 
$result=mysql_query("select * from Products where ID=$id");
$row=mysql_fetch_object($result);
echo "<table>";
echo "
<tr bgcolor='#f1f1f1'><td><b>ID</b></td><td>$row->ID</td></tr>

但是,特定的 ID 没有传递给脚本,并且 view.php 中的表是空白的。将 where 子句更改为 'where id = '1' 时,会显示正确的产品。所以我知道这是有效的。

非常感谢

4

8 回答 8

5

基本 PHP 语法:带引号的字符串'不插入变量值:

echo '<td><a class="index_table" href="includes/view.php?id=' . $row['id'] . '>' . $row['Orderno'] . '">';
                                                            ^^^^^^^^^^^^^^^^^^

请注意,您对SQL 注入攻击持开放态度,只是乞求获得您的服务器 pwn3d。

于 2012-12-17T16:09:13.853 回答
2

第一个问题:

您必须将数组字符串索引放入括号中:

echo '<td><a class="index_table" href="includes/view.php?id='.$row['id'].'">'.$row['Orderno'].'</a></td>';
                                                            ^^^^^^^^^^^^^^  ^^^^^^^^^^^^^^^^^^^

第二个问题:

您在 URL 中的 ID 很容易被替换,'; DELETE FROM table #从而允许攻击者执行 SQL 注入!始终清理参与 SQL 查询的任何用户输入 (POST) 或 GET 参数:

$id = mysql_real_escape_string($_GET['id']);

或者对于那种情况(当需要一个整数时)

$id = (int) $_GET['id'];

建议:不要使用mysql_*函数,而是使用PDOwith(真实!)prepared statements 或至少mysqli_*使用适当输入清理的函数。

于 2012-12-17T16:11:59.130 回答
1

这里有两个大问题。首先,您的链接无法正常工作,因为您在回声中使用了单引号,这意味着变量没有被插值,因此您必须更改为以下任一内容:

echo "<td><a class=\"index_table\" href=\"includes/view.php?id={$row['id']}>{$row['Orderno']}\">";

或者

echo '<td><a class="index_table" href="includes/view.php?id=' . $row['id'] . '>' . $row['Orderno'] . '">';

警告 - 安全漏洞

在您以后的代码中,您让自己容易受到 SQL 注入攻击;可以在OWASPWikipedia上找到有关此内容的一些参考资料,了解这些资料非常重要。为了保护自己,您必须在将数据发送到查询之前对其进行转义。以下是一些方法:

$id = mysql_real_escape_string($_GET['id']); 
$result=mysql_query("select * from Products where ID = '$id'");

或者

$id = $_GET['id']; 
if (!ctype_digit((string)$id)) {
    die('Invalid ID: ' . htmlentities($id));
}
$result=mysql_query("select * from Products where ID = '$id'");

在第一个示例中,我使用mysql_real_escape_string使数据可以安全地嵌入到查询中(请注意,我还在变量周围添加了引号);第二,我做了一个数据检查以确保它只包含数字(注意长度也应该检查,但这是一个简单的例子),如果它包含数字以外的东西,我们会吐出一条错误消息并不要运行查询。

于 2012-12-17T16:14:11.140 回答
0

更改您的查询,例如,我'在 $id 之间添加了两个

$result=mysql_query("select * from Products where ID='$id'");

看看。

于 2012-12-17T16:09:13.973 回答
0

它看起来像标签中的格式错误的 URL,而且 PHP 不解析单引号字符串中的变量。我想你只需要这个:

echo "<td><a class='index_table' href='includes/view.php?id=$row[id]'>$row[Orderno]</a></td>";

您不需要更改 view.php 中的代码,但我建议以这种方式过滤 _GET 变量:

$id = (int)$_GET['id'];
于 2012-12-17T16:11:30.210 回答
0

您实际上并未在查询中包含 $id 变量的值。查看此答案以获取有关如何执行此操作的选项:

如何防止 PHP 中的 SQL 注入?

PDO

$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');

$stmt->execute(array(':name' => $name));

foreach ($stmt as $row) {
    // do something with $row
}

mysqli

$stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?');
$stmt->bind_param('s', $name);

$stmt->execute();

$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
    // do something with $row
}
于 2012-12-17T16:09:50.597 回答
0

您不应该GET像这样将变量直接放入查询中,您应该进行一些健全性检查,例如检查它的数字等,以避免 sql 注入。

毫无疑问,您会得到回答说这些mysql_功能也已被弃用,但我认为这与问题无关。

在您的链接中,您有

<td><a class="index_table" href="includes/view.php?id=$row[id]>$row[Orderno]">

您没有正确的数组元素语法,请尝试

<td><a class="index_table" href="includes/view.php?id=' . $row['id'] . '>' . $row['Orderno'] . '">
于 2012-12-17T16:10:34.783 回答
0

尝试

echo "<td><a class='index_table' href='includes/view.php?id=".$row['id'].">".$row['Orderno']."'>";

<?php
include 'connect.php';
//Display the Data//
$id=$_GET['id']; 
if(is_int($id))
{
    $result=mysql_query("select * from Products where ID=$id");
    $row=mysql_fetch_object($result);
    echo "<table>";
    echo "<tr bgcolor='#f1f1f1'><td><b>ID</b></td><td>$row->ID</td></tr>";
}
else
{
    echo "<h1>Nice try silly... You aint hackin me!</h1>";
}

我还注意到在您的原始代码中您缺少一些结尾引号和分号。那可能就是所有的错误。但这应该可以解决您的安全问题,并且应该适用于您的应用程序

祝你好运。

于 2012-12-17T16:27:52.197 回答