1

これは1時間前までは完璧に機能していましたが、それ以来、私はそれを修正するために頭を悩ませましたが、何も得られませんでした.

コードはユーザーのリストとそれらを禁止するボタンを表に出力しますが、問題は、たとえば 34 番目のユーザーを禁止するをクリックすると、最初のユーザーを禁止し、56 番目のユーザーを禁止するをクリックすると、そのユーザーを禁止することです。 2 番目のユーザー。私のコードを見ると、そうではないことがわかるはずです (uID を除いて、他のすべての詳細は完全に正しいことに注意してください)。

  $query = mysql_query("SELECT id, full_name, banned, username from `tblUsers`");
        while($row = mysql_fetch_array($query)){
            $uID = $row['id'];
            if($row['banned'] == '0'){ 
                $banBool =  '<form id="ban" method="post" action="ban.php?uid='.$uID.'">
            <input type="hidden" name="ban" value="" /> 
            <a onclick="document.getElementById(\'ban\').submit();">Ban</a>
        </form>'; }else{   
            $banBool = '<form id="unban" method="post" action="unban.php?uid='.$uID.'">
            <input type="hidden" name="name" value="" /> 
            <a onclick="document.getElementById(\'unban\').submit();">UnBan</a>
            </form>' ;
        }
            if($row['banned'] == '1'){
                $status = 'Banned';
            }else{
                $status = 'Active';
            }
            echo "<tr><td>" . $row['username'] . " " . $uID . "</td><td>" . $banBool . "</td><td>" . $status . "</td><td>" . $row['full_name'] . "</td></tr>";
        }

問題は action="unban.php?uid='.$uID.' にあります。パスをトレースするとき、IDは常に最小の数値です(上位の結果)

ban.php

<?php
include '../../includes/dataBase.class.php';
sql::connect();
if(!sql::checkAdmin() == 1){
    header("Location: ../myaccount.php");
}
if(!isset($_GET['uid'])){
    header("Location: users.php?action=1");
}
$uid = $_GET['uid'];
$ip = $_SERVER['REMOTE_ADDR'];  
mysql_query("INSERT INTO `uipBan` (`ip`) VALUES ('$ip')")or die(mysql_error()); 
mysql_query("UPDATE tblUsers SET banned = '1' WHERE id = '$uid'")or die(mysql_error());
//header("Location: users.php?action=1");
echo $uid;
?>
4

2 に答える 2

2

そのユーザーを禁止/禁止解除するフォームを各ユーザーに提供します。idそれらは一意ではないため、問題はあなたのフォームにあります。Ban/UnBanリンクをクリックすると、JavaScript はban/unban要素を検索し、最初の要素を見つけて送信します。

解決策は非常に簡単です。

  $query = mysql_query("SELECT id, full_name, banned, username from `tblUsers`");
        while($row = mysql_fetch_array($query)){
            $uID = $row['id'];
            if($row['banned'] == '0'){ 
                $banBool =  '<form id="ban' . $uID . '" method="post" action="ban.php?uid='.$uID.'">
            <input type="hidden" name="ban" value="" /> 
            <a onclick="document.getElementById(\'ban' . $uID . '\').submit();">Ban</a>
        </form>'; }else{   
            $banBool = '<form id="unban' . $uID . '" method="post" action="unban.php?uid='.$uID.'">
            <input type="hidden" name="unban" value="" /> 
            <a onclick="document.getElementById(\'unban' . $uID . '\').submit();">UnBan</a>
            </form>' ;
        }
            if($row['banned'] == '1'){
                $status = 'Banned';
            }else{
                $status = 'Active';
            }
            echo "<tr><td>" . $row['username'] . " " . $uID . "</td><td>" . $banBool . "</td><td>" . $status . "</td><td>" . $row['full_name'] . "</td></tr>";
        }

一意になるように、すべてのフォームと JS 呼び出しにユーザー ID を含めました。(また、2 番目の非表示フィールドの名前はname)

于 2012-04-09T20:48:37.263 に答える
0

はい、@MrFusionはそれを釘付けにしました(+1)。しかし、なぜあなたが単にこのようなことをしていないのか、私にはまだわかりません:

 <?php
 $query = mysql_query("SELECT id, full_name, banned, username from `tblUsers`");

 while($row = mysql_fetch_array($query)) {

      echo "<tr><td>{$row['username']}</td><td>{$row['id']}</td>";

      if($row['banned'] == '0') { 
           echo "<td><a href=\"admin.php?ban={$row['id']}\">Ban</a></td>";
      }
      elseif($row['banned'] == '1') { 
            echo "<td>Banned (<a href=\"admin.php?unban={$row['id']}\">Unban</a>)</td>";
      }
      else { 
           echo "<td>Active</td>"; # Not sure what this is for in your original code
      }
      echo "<td>{$row['full_name']}</td></tr>";
}
?>

次に、admin.php を作成します。

<?php
include "../../includes/dataBase.class.php";
sql::connect();
if(!sql::checkAdmin() == 1){
    header("Location: ../myaccount.php");
}
if(!isset($_GET['ban']) AND !isset($_GET['unban'])){
    header("Location: users.php?action=1");
}

if(isset($_GET['ban'])) { 
    $uid = mysql_real_escape_string($_GET['ban']);
    mysql_query("UPDATE tblUsers SET banned = '1' WHERE id = '{$uid}'") or die(mysql_error());    
    //I don't know what the following two lines are for
    //but they seem to IP-ban the admin himself: you're banning the IP address 
    //of the user doing the ban, not the IP address of the user you are banning. 

    $ip = $_SERVER['REMOTE_ADDR'];  
    mysql_query("INSERT INTO `uipBan` (`ip`) VALUES ('{$ip}')") or die(mysql_error()); 
}
elseif(isset($_GET['unban'])) { 
    $uid = mysql_real_escape_string($_GET['unban']);
    mysql_query("UPDATE tblUsers SET banned = '0' WHERE id = '{$uid}'") or die(mysql_error());        
} 

header("Location: users.php?action=1");
?>

信頼できるユーザーからのものであっても、mysql_real_escape_string を使用してユーザー入力をエスケープすることの重要性に注意してください。これにより、データベース全体が失われる可能性のある SQL インジェクションが防止されます :)

于 2012-04-10T06:50:08.227 に答える