难以通过GET变量?

时间:2012-12-17 16:06:06

标签: php html sql get

您好我试图通过将变量名称附加到以下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'时,将显示正确的产品。所以我知道这是有效的。

非常感谢

8 个答案:

答案 0 :(得分:5)

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

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

请注意,您对SQL injection attacks持开放态度,只是想让您的服务器获得pwn3d。

答案 1 :(得分:2)

第一个问题:

您必须将数组字符串索引放入一个paranthesis:

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

第二个问题:

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

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

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

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

建议:不要使用mysql_*函数,而是使用PDO和(real!)预处理语句或至少mysqli_*函数进行正确的输入清理。< / p>

答案 2 :(得分: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 Injection攻击持开放态度;可以在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使数据安全嵌入查询中(请注意,我还在变量周围添加了引号);在第二个,我做了一个数据检查,以确保它只包含数字(请注意,也应检查长度,但这是一个简单的例子),如果它包含除数字以外的东西,我们吐出一个错误消息,不要运行查询。

答案 3 :(得分:0)

更改您的查询,我在$ id

之间添加了两个'
$result=mysql_query("select * from Products where ID='$id'");

看看。

答案 4 :(得分:0)

您实际上并未在查询中包含$ id变量的值。请看一下这个答案,了解如何执行此操作的选项:

How can I prevent SQL injection in PHP?

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
}

答案 5 :(得分: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'] . '">

答案 6 :(得分: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'];

答案 7 :(得分: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>";
}

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

祝你好运。