您好我试图通过将变量名称附加到以下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'时,将显示正确的产品。所以我知道这是有效的。
非常感谢
答案 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攻击持开放态度;可以在OWASP和Wikipedia找到对此内容的一些参考,并且非常重要。为了保护自己,您必须在将数据发送到查询之前将其转义。以下是一些方法:
$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>";
}
我还注意到你的原始代码中缺少一些结尾引号和分号。这可能是一切都是错的。但这应该可以解决您的安全问题并且应该适用于您的应用程序
祝你好运。