2016-09-28 2 views
0

私は明らかに各行にIDを持つテーブルを持っています。ユーザーがテーブルの行をクリックすると、彼は完全なデータを表示している別のページに移動します(別のページは、実際にロードイベントの後に表示されていない同じページです)。firebugでテーブルデータが操作されたかどうかを確認する最も簡単な方法は

jqueryでclickイベントを取得してから、jquery loadにidを送信すると、データが読み込まれます。

これは問題です。ページを使用している人が火かき棒をインストールしている場合、彼はテーブル上のIDを操作し、アクセスしてはならないものにアクセスすることができます。

私は、そのユーザーがアクセスできるIDをチェックする関数を記述しなければなりませんでした。

function checkID($searchColumn,$userColumn,$tablename,$table_id,$user_id) 
{ 
    Global $db; 
    $query = "SELECT `{$userColumn}` FROM $tablename WHERE `{$searchColumn}`=?"; 
    //echo $query; 
    $stmt = $db->prepare($query); 
    $stmt->bind_param('i',$table_id); 
    $stmt->execute(); 
    $stmt->bind_result($myuser_id); 

    if($stmt->fetch()) 
    { 
     if($myuser_id==$user_id): 
      return true; 
     else: 
      return false; 
     endif; 
    } 
} 

上記の関数は、基本的に、ユーザーがそのidにアクセスできるかどうかによって、trueまたはfalseを指定します。

サーバーサイドのFirebugでデータが操作されたかどうかを確認する良い方法はありますか?

基本的には、サーバーに送信されるIDが、テーブルにある同じIDであり、かつ、firebugによって操作されていないことを確認したいと思います。私の機能が働いても、おそらくもっと簡単な解決法があると思っています。専門家は何をしていますか?

+0

現在、ブラウザには開発ツールが組み込まれているため、Firebugをインストールする必要はありません。 –

+0

私は同意します。 Firebugがその一例です。私はそこに他の人がいることを知っているが、私はfirebugが私が知っているものだからfirefoxを使う。私はIDを検証する簡単な方法を、私が使っているものよりも探していて、プロが何をしているのかを尋ねていました。 –

+0

2つのメモ:1. [Firebugは去っています](https://blog.getfirebug.com/2016/06/07/unifying-firebug-firefox-devtools/)ので、ある時点で組み込みの[Firefox DevTools](https://developer.mozilla.org/en-US/docs/Tools)を参照してください。 2.私は答えを出しましたが、テーブルが実際どのように見えるかはまだ分かりません。 –

答えて

1

クライアントからのデータ常には、サーバー側で検証され、サニタイズされる必要があります。

I.e. $searchColumn,$userColumn,$tablename,$table_idおよび$user_idがリクエスト変数として指定されている場合は、それぞれの妥当性をチェックする必要があります。特に$userColumn,$tablenameおよび$searchColumnは、prepare()に電話する前に追加されているため、SQLインジェクションについては注意深く確認する必要があります。
柔軟性が必要ない場合は、テーブル名と列名を文字列に入力する必要があります。

ユーザーIDをサーバー側に(セッション変数として)保持し、ログイン時に一度だけ設定することもできるので、チェックを完全に取り除くことができます。ただし、ユーザー・データを参照する表にはユーザーIDを持つ列が必要です。

ユーザーが表示されるはずのデータにのみアクセスできるようにするには、ユーザーIDをクエリに含める必要があります。

例:

あなたはm個の関係を1に注文と注文項目を持っている想像してみてください。自分が作成した注文のリストをユーザーに表示します。ユーザーがアイテムを表示するための注文を選択すると、ユーザーIDをクエリに含めて、ユーザーが他のユーザーの注文にアクセスできないようにすることができます。

その後SELECT文は次のようになります。

SELECT oi.name, 
     oi.description 
     oi.price 
FROM order_item oi 
INNER JOIN order o ON o.id = oi.order_id 
WHERE o.id = ? 
    AND o.userID = ? 

ユーザーが他のユーザーのためのIDを提供する場合、すべての項目が返さがありません。

これは、最初にorderテーブルに対してクエリを作成して、その注文がユーザーに割り当てられているかどうかを確認し、そうであれば注文アイテムに対してクエリを実行することによっても実行できます。

+0

私の関数がチェックしているのは、テーブルの行IDのみです。私はテーブル名と他のすべてを渡して、私の関数がそれらをチェックできるようにしなければなりません。基本的に私はテーブルの行をクリックすると私はどこにデータを見てどこにそれらを取っているが、彼らはIDを操作した場合、彼らは見てはならないデータを見ることがあります。衛生に関しては、私は常に準備された質問を使用します。私が示したコードは、idが有効であることをチェックするための私の現在の関数です。それは正常に動作しますが、私はより単純な解決策を探していました –

+0

私はIDが変更された場合、このメソッドを使用して、クエリはデータを戻しません。私はちょうどあなたが見ているidで検索しています。だから私のクエリでは、IDとユーザーIDを検索する必要があります。次に、彼らがfirebugのidを変更した場合、クエリは空になります。なぜ私はこれを考えなかった –

+0

まさに!データが実際にユーザーに割り当てられているかどうかを確認する必要があります。私はさらに2つの別々のクエリでこれを行うことができることに留意して答えを更新しました。テーブル間の関係によって複雑になるかもしれませんが、基本的には、データがユーザーに属しているかどうかを常に問い合せることができます。最も簡単な答えを見るのは簡単ではない場合もあります。 :-) –

関連する問題