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句を'whereid ='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

最初の問題:

配列文字列インデックスをparanthesisに配置する必要があります。

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

2番目の問題:

URL内のIDは簡単に置き換えることが'; DELETE FROM table #できるため、攻撃者はSQLインジェクションを実行できます。SQLクエリに参加するユーザー入力(POST)またはGETパラメーターは常にサニタイズします。

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

またはその場合(整数が予想される場合)

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

提案:mysql_*関数を使用せずPDOに、(実際の!)プリペアドステートメントまたは少なくともmysqli_*適切な入力サニタイズを備えた関数を使用してください。

于 2012-12-17T16:11:59.130 に答える
1

ここに2つの大きな問題があります。まず、エコーで一重引用符を使用しているため、リンクが正しく機能していません。つまり、変数が補間されていないため、次のいずれかに変更する必要があります。

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は、クエリに埋め込むためにデータを安全にするために使用します(変数の前後に引用符も追加したことに注意してください)。2番目では、数字のみが含まれていることを確認するためにデータチェックを行い(長さもチェックする必要がありますが、これは簡単な例です)、数字以外のものが含まれている場合は、エラーメッセージを出力してクエリを実行しないでください。

于 2012-12-17T16:14:11.140 に答える
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 に答える
0

クエリを次のように変更します。'$idの間に2つ追加しました

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

そして、見てください。

于 2012-12-17T16:09:13.973 に答える
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

タグ内の不正な形式の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 に答える