私は前のコメントを要約しました。
1.問題:あなたは同じ変数
function login($email,$password){
と$strQuery = " ... WHERE EMAIL = '$email' AND PASSWORD = '$password'";
2. Recomendationを使用しませんでした:あなたが使用してSQL要求に
同じnamming規則を使用しフィールドを使用する2つの方法:USERS.EMAIL
とEMAIL =
( `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');
?>
- 訪問のindex.phpを - デバッグ上>何も
- 訪問のpage.php - >あなたはindex.phpをインデックスに
- にリダイレクトされます。 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
?>
こんにちは。 Threはエラーです。 var '$ email'だがあなたの関数には' $ user'が定義されています。あらゆる種類の攻撃からあなたの変数を保護しましたか? リクエストで 'table.field'を使用しましたが、where部分では使用しませんでした。正常? (両方のテーブルに同じフィールドを共有する必要がない場合は、はい)。 Lat物:あなたのBdのためのフレームワークを使いましたか? PDO? –
ありがとう:)!編集されました!私はmysqliを使用しています!パスワードのハッシュやものはありません。 POSTメソッドを持つフォーム。 –
初めにハッシングやその他のものはありません。しかし、実動システムではありません(必要に応じて後で追加します:p)。あなたのデータを守ることを忘れないでください。例: '$ post_email = isset($ _ POST ['email'])? htmlspecialchars($ _ POST ['email']):null; '$ this-> login($ post_email、...)'の後に、この '$ email = $ mysqli-> real_escape_string($ email)のようなものを使用します。 'あなたのSQLに直接使用する前に –