3

すべての横に[削除]リンクが表示されて$rowsいます。それらの上にマウスを置くと、削除する正しいIDが反映されますが、クリックすると、たとえばにDELETEリダイレクトされ、何も削除されず、エラーは投稿されません。phpfile.php?id=4

while ($row = mysqli_fetch_array($r,MYSQLI_ASSOC))
{
    echo '<tr><td align="left">' .
    $row['title'] . '</td><td align="left">'
    . $row['genre'] . '</td><td align="left">'
    . $row['length'] . '</td><td align="left">'
    . $row['created'] . '</td><td align="left">'
    . $row['views'] . '</td><td align="left">'
    . "<a href='newwriter_profile.php?id={$row['upload_id']}'>Delete</a></td>" .      '</tr>';
}
echo '</table>'; // Close the table

同じページに存在するコードの残りの部分:

if(isset($_GET['id'])) {
// Get the ID
$id = intval($_GET['upload_id']);


require_once ('../mysqli_connect.php'); //Connect to the db




    $delquery = "
        DELETE 
        FROM upload
        WHERE upload_id = {$id}";
    $done = @mysqli_query ($dbc, $delquery); // Run the query

    if($done) {
        // Make sure the result is valid
        if (mysqli_num_rows($done)==1) {
        echo 'Record Deleted';
        }
        else {
            echo 'error - delete failed';
        }

        // Free the mysqli resources
        @mysqli_free_result($result);
    }
    else {
        echo "Error! Query failed:" .$mysqli_error($dbc);
    }
    mysqli_free_result($done);
    mysqli_close($dbc);
}

このバグを解決できれば、ダウンロード機能を除いて同様のバグを解決します。

4

1 に答える 1

2

を使用する場合は$id、存在しないものからプルします。が設定されていないため、その値は、0として解釈されます。クエリは次のようになります。 $_GET['upload_id']$_GET['id']$_GET['upload_id']NULLDELETE FROM upload WHERE upload_id = 0

$id = intval($_GET['upload_id']);
// Should be
$id = intval($_GET['id']);

を使用する代わりに、でintval()より広範な境界チェックを使用することをお勧めします$id。たとえば、のような文字列"abc"が渡された場合?id=abcintval("abc")それを0にキャストし、クエリに0を渡します。id正の整数にする必要がある場合は、次のようなものを使用します。

if (ctype_digit($_GET['id'])) {
  // ok, do your query
}
else {
  // invalid input, report error to user and don't touch your database.
}

最後に、スクリプトの残りの部分は表示されませんが、ハイパーリンクを使用して削除アクション(またはそれに関するアクション)を実行する場合は、通常、削除しようとしている行の所有権を確認してからアクション。ログインしたユーザーが行を削除する権限を持っていることを確認してください。そうでない場合は、データベースアクションを実行しないでください。そうしないと、すべてのユーザーがURLに任意の値を渡して、他のユーザーのデータを変更する可能性があります。推奨読書: スパイダーオブドゥーム

于 2012-05-11T02:09:12.887 に答える