2016-07-22 14 views
0

プロフィールページでは、PHPとMySQLを使用して項目を表示しています。
二つのことは、私は
約束カントー聞きたいがあります:あなたは私を助けることができる場合、私は私のウェブサイトであなたを認識し、クレジットであなたを置くことができます;)

質問1:
どのようにユーザーがデータベースに存在するかどうか、404メッセージを表示する方法を確認します。プロフィールページPHP + MySQL

質問2:
ので、ここでの主なバグは、ユーザーを検索するとき、それはユーザーを認識しないです。
ユーザー "admin01"が自分自身とプロファイルページを検索している場合、ユーザーadmin01ユーザーを検索admin02、このページはユーザーに情報を提供しません。とにかくこれを修正する方法は?

その他の情報:
サイトでは、GETメソッドを使用してURLを確認します(例:profile.php?username=admin01)。ユーザー情報が表示されます。ユーザーがログインしていない場合、ページはログインページにリダイレクトされます。

コード:

<?php 
ob_start(); 
session_start(); 
require_once 'dbconnect.php'; 

if(!isset($_SESSION['user'])) { 
    header("Location: index.php"); 
    exit; 
} 
// select loggedin users detail 
$res=mysql_query("SELECT * FROM users WHERE userId=".$_SESSION['user']); 
$userRow=mysql_fetch_array($res); 
?> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>Welcome - <?php echo $userRow['userName']; ?></title> 
<link rel="stylesheet" href="assets/css/bootstrap.min.css" type="text/css" /> 
<link rel="stylesheet" href="style.css" type="text/css" /> 
</head> 
<body> 

<nav class="navbar navbar-default navbar-fixed-top"> 
     <div class="container"> 
     <div class="navbar-header"> 
      <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar"> 
      <span class="sr-only">Toggle navigation</span> 
      <span class="icon-bar"></span> 
      <span class="icon-bar"></span> 
      <span class="icon-bar"></span> 
      </button> 
      <a class="navbar-brand" href="http://www.codingcage.com">Prospekt | A Gaming Community</a> 
     </div> 
     <div id="navbar" class="navbar-collapse collapse"> 
      <ul class="nav navbar-nav"> 
      <li class="active"><a href="#">Dashboard</a></li> 
      <li><a href="../home.php">Home</a></li> 
      <li><a href="/forums.php">Forums</a></li> 
      </ul> 
      <ul class="nav navbar-nav navbar-right"> 

      <li class="dropdown"> 
       <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false"> 
    <span class="glyphicon glyphicon-user"></span>&nbsp;Member - <?php echo $userRow['userName']; ?>&nbsp;<span class="caret"></span></a> 
       <ul class="dropdown-menu"> 
       <li><a href="logout.php?logout"><span class="glyphicon glyphicon-log-out"></span>&nbsp;Sign Out</a></li> 
       </ul> 
      </li> 
      </ul> 
     </div><!--/.nav-collapse --> 
     </div> 
    </nav> 

<div id="wrapper"> 

<div class="container"> 

    <div class="page-header"> 
    <h1>Prospekt | A Gaming Community</h1> 
    <h4> Dashboard | See your live ranking, stats, and more! </h4> 
    </div> 
<?php 
$username = $_GET['username']; 
if (isset($username) === true && empty($_GET['username']) === false){ 
    echo $username; 
} else { 
    echo "Please search for a valid user!"; 
} 
?> 
     <div class="row"> 
     <div class="col-lg-12"> 

     </div> 
     </div> 

    </div> 

    </div> 

    <script src="assets/jquery-1.11.3-jquery.min.js"></script> 
    <script src="assets/js/bootstrap.min.js"></script> 

</body> 
</html> 
+0

サイドノート:長い非推奨のデータベースアダプタ(古い 'mysql _...()'関数)を使用していて、あなたのスクリプトはSQLインジェクション攻撃に対してオープンでオープンしています...あなたのスクリプトを 'mysqli'データベースアダプタとして「PDO」を使用します。その公式文書をチェックしてください。そして、あなたのコードを安全にするために "prepared statements"と "parameter binding"を使う利点について学びましょう。 – arkascha

+0

ヒントをお寄せいただきありがとうございます。これは実際にはlocalhostedです。これを "オンライン"に移植すると、これは変更され、mysqliまたはPDOを後で使用します:) – astroXoom

+0

質問2の回答は明らかです。スクリプトの先頭で、引数として指定されたユーザー名のようにセッション変数が存在するかどうかをチェックします。これは現在ログインしているユーザー以外のユーザーには当てはまりません。したがって、実際に自分が達成しようとしていることを防ぐことができます。 – arkascha

答えて

1

問題は主にあなたが使用することを選択したHTMLにあります。それは、ユーザーのホームページのためのものであるという印象を与えます。そのHTMLを新しいものに置き換える必要があります。このようなPHPコードが必要です

ob_start(); 
session_start(); 
require_once 'dbconnect.php'; 

if(!isset($_SESSION['user'])) { 
    header("Location: index.php"); 
    exit; 
} 
else { 
    /* find out if a user exists and raise 404 if not? Here's how */ 

    $sql = 'SELECT COUNT(*) from users WHERE username = ? LIMIT 1'; 
    $stmt = $conn->prepare($sql); 
    $stmt->bindParam(1, $_GET['username'], PDO::PARAM_INT); 
    $stmt->execute(); 
    if($stmt->fetchColumn()) { 
     /* now an authenticated users is trying to see a profile page 
      on your website for a user who exists */ 
     // CREATE THE APPROPRIATE HTML 

    } 
    else 
    { 
     header('HTTP/1.0 404 not found'); 
    } 
} 

私はPDOを使用しています。 mysql_ *関数は使用しないでください。現在のコードでクエリパラメータをエスケープしていません。致命的な危険。あなたの質問はありません2については

$res=mysql_query("SELECT * FROM users WHERE userId=".$_SESSION['user']); 
$userRow=mysql_fetch_array($res); 
+0

実際に、このような明示的な「ユーザーが存在するかどうかの確認」クエリを必要とせず、指定されたユーザーデータを_fetch_するためにOPが使用するクエリで十分です。明らかに、パラメータバインディングに変更する必要があります。 – arkascha

+0

私の質問2は:私は自分のプロフィールを検索していますが、それは動作していますが、他のプロフィールを検索したとき、profile.phpは自分の情報を表示しています。 "固定PHPコード"? – astroXoom

+0

これは固定コードです。 PDOはSQLインジェクションに脆弱ではない – e4c5

0

:あなたはメソッド

<?php 
    $username = $_GET['username']; 
    if (isset($username) === true && empty($_GET['username']) === false && $username != $userRow['userName']){ 
     echo $username; 
    } else { 
     echo "Please search for a valid user!"; 
    } 
?> 

そして、あなたのための$ _GETをチェックしている次の条件を追加するには、元のコードに次の行を削除する必要があることを

注意質問1:SELECTクエリで配列ではないIDを確認できます。ヘッダーの場所を404 Pageに変更することができます。

関連する問題