-1

以下のコードは、データベース内に、Cookie ログインから取得したユーザー名を持つ行を持つ人物がデータベースに存在するかどうかを確認することになっています。このuser_idを持つデータベースでは、エコーするはずです。これまでのコードは次のとおりです。これを行う方法を教えてください。また、誰かが私に言う前に、私が持っているようなmySQLステートメントが減価償却されていることを知っています。これが私のコードです:

<?php
include("dbconnect.php");
mysql_select_db("maxgee_close2");
$username = $_COOKIE['maxgee_me_user']; 
$result = mysql_query("select user_id from users where username = '$username'");
$row = mysql_fetch_array($result);    
mysql_free_result($result);
$check = mysql_query("SELECT * FROM events_main WHERE user_id ='$row['user_id']'") or die(mysql_error());
if(1==1){
  if (mysql_num_rows($check)>0) 
 {
include("example.php");
 }
  else
  {
  echo "example";
  }
}

?>
4

2 に答える 2

1

二重引用符で囲まれた文字列では、全体を で囲まずに配列キーを引用したため、配列変数$row['user_id']が正しく解析されていません{}配列 key を引用しない{}場合は、二重引用符で囲まれた文字列のthe を省略できますが、読みやすくなります。{}

check = mysql_query("SELECT * FROM events_main WHERE user_id ='{$row['user_id']}'") or die(mysql_error());
//-------------------------------------------------------------^^^^^^^^^^^^^^^^^^

// Also acceptable, but not as tidy, and troublesome with multidimensional 
// or variable keys - unquoted array key
check = mysql_query("SELECT * FROM events_main WHERE user_id ='$row[user_id]'") or die(mysql_error());
//-------------------------------------------------------------^^^^^^^^^^^^^^^^^^

前述のように、$_COOKIEは安全な値とは見なされません。mysql_*()古いAPIを引き続き使用する場合は、SQL インジェクションに対して値をエスケープする必要があります。

$username = mysql_real_escape_string($_COOKIE['maxgee_me_user']);
于 2012-10-25T01:55:26.167 に答える
0

2 Waleed が SQL インジェクションに対してオープンであると述べたように、すぐに発生したことは、あまり良いことではありません。MySQLi と PDO に関するチュートリアルを読んで、そこからより良い方法やクエリの実行に飛び込んでみます。

また、セッションの代わりに Cookie を使用してユーザー名を保存することを選択していますか? Cookie はクライアント側で変更して、firebug を持つ賢いユーザーが望んでいることを何でも言うことができます。セッションはサーバー側に保存され、クライアント (エンドユーザー) にはセッションの ID のみが与えられます。セッションとして送信した場合、ユーザー名を変更することはできません。(彼らはセッションIDを別のランダムな数字に変更しようとするかもしれませんが、それは風に小便をするようなものです、私のフランス語を許してください.

私が思うにあなたをあなたの道に連れて行くいくつかの疑似コードをここに示します

<?php
 include("dbconnect.php");

 $database = "maxgee_close2"; //Set the database you want to connect to

 mysql_select_db($database); //Select database

 $username = $_SESSION['maxgee_me_user']; //Grab the username from a server-side stored session, not a cookie!

 $query = "SELECT user_id FROM `users` WHERE `username` = '" . mysql_real_escape_string($username) . "' LIMIT 1"; //Note the user of mysql_real_escape_string on the $username, we want to clean the variable of anything that could harm the database.

 $result = mysql_query($query);

 if ($row = mysql_fetch_array($result)) {
  //Query was ran and returned a result, grab the ID
  $userId = $row["user_id"];

  mysql_free_result($result); //We can free the result now after we have grabbed everything we need

  $query_check = "SELECT * FROM `events_main` WHERE `user_id` = '" . mysql_real_escape_string($userId) . "'";

  $check = mysql_query($query_check);
   if (mysql_num_rows($check)>0) {
    include("example.php");
   }
   else {
    echo "example";
   }
 }

 ?>

そのコードは機能する場合と機能しない場合がありますが、実際の重要な変更点は、mysql_free_result($result); を実行していたという事実です。スクリプトがデータベースからユーザー ID を取得する前に。

全体として、私は本当に戻って、さらにいくつかのチュートリアルを読みます.

于 2012-10-25T01:58:29.307 に答える