-1

私は次のようなフォームを持っています:

<form action="del.php" method="post" enctype="multipart/form-data">
Number of field to show:<input type="text" name="limit" /><br /><br /> 
Top category: 
<select name="topcat"> 
<option>tech</option>
<option>automobile</option>
</select><br /><br />
Base category: 
<select name="cat"> 
<option>mobile</option>
<option>computer</option>
</select> 

<input type="submit" />
</form>

ページから選択したデータベースから特定の ID を削除するコードを作成しようとしています: del.php :

<head>
<?php
require_once('globals.php');// for database connection
?>
</head>
<body>
<?php

        $cat = $_POST['cat'];
    $topcat = $_POST['topcat'];
    $limit = $_POST['limit'];

if(isset($_GET['delete']))
{

    $query = 'DELETE FROM '.$cat.' WHERE id = '.(int)$_GET['delete'];
    echo $query;
    $result = mysql_query($query);
}



$query = 'select id,headline from '. $cat.' order by date DESC limit 0,'.$limit;
$result = mysql_query($query);
while($row = mysql_fetch_assoc($result))
{

$headline=$row['headline'];

    echo '<div class="record" id="record-'.$row['id'].'">
                <a href="?delete='.$row['id'].'" class="delete">Delete</a>
                <strong>'.$headline.'</strong>
            </div>';
}
?>

</body>

問題:isset($_GET['delete']実行すると undefined variable と表示されますcat。しかし$cat、前のフォームから解析されたものとして定義されています。解決策はありますか?

4

2 に答える 2

2

ここに簡単なレッスンがあります

レッスン 1 :

HTTP GET リクエストに関するレッスン:
決して 決して 決して 決して... GET リクエストを使用して更新/削除を実行しないでください。 GETよりも、それは無敵という意味ではありません..常にサニタイズしてください!

htt://yourunsecureedwebsite/del.php?delete=10

悪用者は、このリクエストを Web ページに送信します。

htt://yourunsecureedwebsite/del.php?delete=10' または 1=1'

お前、やっちゃったんだな。テーブル全体が削除されます。したがって、GET リクエストを使用してデータベースを変更しないでください。

教訓 2:
常に常に GET および POST リクエストをエスケープ/サニタイズする 昔mysql_real_escape_string()から、悪意のあるリクエストから保護するために頼っていました。しかし、すべての mysql_* には独自の脆弱性があったため、PHP キーパーはこの機能を非推奨にしました。

そのため、この悪意のあるコードを処理する機能を備えたMysqliPDOが私たちの助けになりました。prepare()もう注射の心配はありません。(私は個人的にこれに加えてサニタイズを追加します)

今あなたのコード:

コメントセクションで述べたように、それはフォームのようには見えず、何も削除することを意図していません.フィールドの数とカテゴリを選択し、送信元がPOSTリクエストを使用して送信されたときの検索クエリフォームのように見えます.クエリに従ってデータを表示します。実際には、カテゴリの削除に関するリクエストは送信されていません。

必要なものを実装する手順は次のとおりです。最初に投稿リクエストを行うときは、ページが投稿リクエストで読み込まれたかどうかを常に確認してください。あなたの場合、最初の行は次のようになります。

if($_isset["submit"]){
    $cat = sanitize($_POST['cat']);
    $topcat = sanitize($_POST['topcat']);
    $limit = sanitize($_POST['limit']);
}

sanitizePOST データをサニタイズするために作成する必要があるカスタム関数。(あなたが始めるための何か)。

データベースの部分: MySQLi または PDO の実装方法に関する小さなチュートリアル (素晴らしいチュートリアルと PDO に関する知識)を参照してください。

フォームと一緒にカテゴリも削除したい場合は、そのカテゴリの ID を取得して削除する方法を見つける必要があります。これは 2 つの方法で行うことができます: 1> 非表示の ID フィールドを送信できます ( safe) 2> 選択したカテゴリに応じて、データベースから ID を取得します。

注: 一度に実行できるのは、GET要求またはPOST要求のみです。GET リクエストを模倣できる URL に値を追加する方法はありますが、これは学習プロセスにおけるもう 1 つの重要なチュートリアルです。

オンラインでコンテンツを作成する前に、安全なアプリケーションの作成に関するチュートリアルを実行することをお勧めします。

ディネッシュ

于 2013-05-12T08:18:08.130 に答える
-3

投稿されたすべてのコンテンツに if (isset()) 構造を使用し、問題がある場合は、else を使用して関連する通知を表示し、トラブルシューティングを行います。

おそらく $delete はフォームのチェックボックスから送信されているため、整数値を保持し、GET ではなく POST する必要があります。お任せします。

于 2013-05-12T07:27:10.250 に答える