2016-10-29 12 views
0

私のSQLスキーマ(Different types of users redirected to same page (index.php) with different content)を実行した後、私は自分のログインシステムを作り始めています。php - 同じページへのログイン、静的ではあるが異なるロール

function login($email,$password){ 

$mysqli = $this ->dbConnect(); 
if($mysqli){ 

    $strQuery = "SELECT USERS.ID, USERS.EMAIL, TYPES.NAME FROM `USERS` LEFT JOIN `TYPES` ON USERS.TYPEID = TYPES.ID WHERE `EMAIL` = '$email' AND `PASSWORD` = '$password'"; 
    $recordSet = $mysqli->query($strQuery); 
    $row = $recordset->fetch_assoc(); 
    if($recordset->num_rows>0){ 
     $_SESSION['auth'] = $row['ID']; 
     $_SESSION['username'] = $row['EMAIL']; 
     $_SESSION['type'] = $row['NAME']; 
     header ("location:"index.php"); 
     return true; 
    } 
    //.... 
} 

}

これはよく見るん。 私は今、これは持っていますか?クエリは正しいですか?改善のための提案?

UPDATE

私は私のログインが今取り組んでいます。そして、index.phpにリダイレクトしています。しかし、インデックスPHPで私は私の関数のログインに格納されている$ _SESSIONS変数にアクセスする必要はありません。アトリビューションに問題はありますか?機能の中にヘッダーを置くことは良くありませんか? ありがとう:)

+0

こんにちは。 Threはエラーです。 var '$ email'だがあなたの関数には' $ user'が定義されています。あらゆる種類の攻撃からあなたの変数を保護しましたか? リクエストで 'table.field'を使用しましたが、where部分では使用しませんでした。正常? (両方のテーブルに同じフィールドを共有する必要がない場合は、はい)。 Lat物:あなたのBdのためのフレームワークを使いましたか? PDO? –

+0

ありがとう:)!編集されました!私はmysqliを使用しています!パスワードのハッシュやものはありません。 POSTメソッドを持つフォーム。 –

+0

初めにハッシングやその他のものはありません。しかし、実動システムではありません(必要に応じて後で追加します:p)。あなたのデータを守ることを忘れないでください。例: '$ post_email = isset($ _ POST ['email'])? htmlspecialchars($ _ POST ['email']):null; '$ this-> login($ post_email、...)'の後に、この '$ email = $ mysqli-> real_escape_string($ email)のようなものを使用します。 'あなたのSQLに直接使用する前に –

答えて

0

私は前のコメントを要約しました。

1.問題:あなたは同じ変数

function login($email,$password){$strQuery = " ... WHERE EMAIL = '$email' AND PASSWORD = '$password'";

2. Recomendationを使用しませんでした:あなたが使用してSQL要求に

同じnamming規則を使用しフィールドを使用する2つの方法:USERS.EMAILEMAIL =( `arroundを使用)。 同じものを使用してください。これは後で&のデバッグが容易になります。

:もちろん、table.fieldは使用しないでください。たとえば、テーブルが1つだけの場合や、フィールド間でフィールドが共有されていない場合は必須ではありません。私のペルーの使用のために、私はいつもこれをtable.fieldと使います。これは、将来の問題を防ぐことができます:)

3.任意の注入

例からデータを保護:

$post_email = isset($_POST['email']) ? htmlspecialchars($_POST['email']) : null; 

アルターコール

$this->login($post_email, ...) 

そして最後に、このようなものを使用しますあなたのデータを保護する:

$email = $mysqli->real_escape_string($email); 

、あなたはあなたの要求のために準備ができている:

" SELECT [..] FROM users as u [...] WHERE u.email = '$email' " 

4.または使用特定の機能

例(real_escape_stringもう必要ありません):

$stmt = $dbConnection->prepare('SELECT * FROM users WHERE email = ? AND password = ?'); 
$stmt->bind_param('s', $email); 
$stmt->bind_param('s', $password); 

$stmt->execute(); 

$result = $stmt->get_result(); 
while ($row = $result->fetch_assoc()) { 
    // do something with $row 
} 

http://php.net/manual/fr/class.mysqli.php

5。あなたはspacificページ上のセッションをアクティブにしたい場合はセッション

は、(1行目)最初コードがsession_start()でなければなりません。

セッションをアクティブにし、ロードのコンテンツを含む$ _SESSION変数を使用します。

<?php // index.php 
session_start(); // first line 

// ... code 
var_dump($_SESSION); 
?> 

&

<?php // page.php 
session_start(); // first line 

// ... code 
$_SESSION['test'] = time(); 
Header('Location: index.php'); 
?> 
  1. 訪問のindex.phpを - デバッグ上>何も
  2. 訪問のpage.php - >あなたはindex.phpをインデックスに
  3. にリダイレクトされます。 php - >データがあります

お楽しみくださいセッション:まずP

6.ハンドル特定のデータ

、各ユーザーの資格アクセス(ACL)を格納するための方法をcoose必要があります。たとえば、データベースに100001という値を格納し、各番号は特定のアクション(バイナリアクセスモード)のためのyes/noアクセスです。もう1つのシステムはレベル '1,2,3,4,5' ...または 'member、customer、admin、...'を保存することです。非常に多くの方法:)

私はあなたのサイトのどのページでログインページ

// is user successfully logged 
$_SESSION['access'] = $row['access']; // member|customer|admin 
// Header('Location: index.php'); 

USER.ACCESS = member|customer|adminソリューション

を選択します:

if(in_array($_SESSION['access'], ['member', 'admin'])) { 
    echo 'You are a member, you can see this part'; 
} 

if(in_array($_SESSION['access'], ['customer', 'admin'])) { 
    echo 'You are a customer, you can see this part'; 
} 

それとも

if(checkAccess()) { 
    echo 'Welcome user !'; 

    if(checkAccess(['member', 'customer'])) { 
    echo 'This is a section for member, customer or admin :)'; 
    } 

    if(checkAccess('member')) { 
    echo 'You are a member, you can see this part'; 
    } 

    if(checkAccess('customer')) { 
    echo 'You are a customer, you can see this part'; 
    } 
} 

function checkAccess($types = null) { 
    if(!isset($_SESSION['access'])) 
    return false; // not logged 

    if(is_null($types)) 
    retun true; // if empty, provide info about loggin. 

    // admin has always access to all sections of the website 
    $hasAccess = in_array($_SESSION['access'], ((array) $types) + ['admin']); 
    return $hasAccess; // user is logged + has accessor not ? 
} 

もちろん、あなたも含まれるページのbegeningで、includes

if(checkAccess('member')) { 
    include 'secret_page_for_member.php'; 
} 

を使用したりすることができます

<?php 
if(!checkAccess('admin')) { 
    return '403 - Not authorized'; 
    // die('403'); 
    // throw new Exception('403'); 
} 
// your code 
?> 
+0

うわー!素晴らしい説明!異なる役割に基づいてindex.phpに異なるinclude(path/to/html)ファイルを配置します!あなたは私をたくさん助けました@Georges O. –

+0

もう一つのヒント:私はセッションの初期化、SQL接続、および他のすべての設定変数とstuffで 'common.php'ページを作成します。このページは私のウェブサイトのすべてのページに含まれています。感謝! –

+0

ありがとう!すべてのコンテンツを.phpファイルに移動しています(sql connなど)。あなたはif {include(htmlcontent)?私は、Jsを使ってコンテンツを表示/非表示にしている人がいることがわかりました。このUSRのアプローチでは安全ではないと思っています。あなたの意見にはどのような最善のアプローチがありますか? –

関連する問題