2016-05-15 6 views
0

登録とログインを使用する最初のウェブサイトを設定しました。これはphpとmysqlを使って実装されています。私の問題は、ユーザーがログインページを通過した後にアクセスしたページのURLを取得した場合、彼は現在そのページをコピーしてURLに貼り付けてログインをバイパスできることです。ログイン画面をバイパスしてログインする

質問:実際のログインが確実に行われる方法はありますか?

私のホストである000Webhost(無料)は、フォルダをパスワードで保護することができますが、私はこれをユーザーデータベースにどのように張っているのかわかりません。

これは私がこの問題について尋ねた最初の質問です。

+0

この投稿彼女:http://stackoverflow.com/questions/37234576/php-setting-session-information-in-a-cookie-after-page-reload – Munsterlander

+0

@Paulは私の回答を助けましたか? – Webeng

答えて

1

はい、ユーザーがログインしているかどうかを確認する簡単な方法があり、$_SESSIONスーパーグローバルを使用するのが最善の方法です。セッションスーパーグローバルを使用すると、基本的に特定のユーザーに関するサーバーに情報を保存すると同時に、セッションが有効である限り(通常は30分)、ユーザーを一意に識別するCookieをユーザーのコンピュータに保存します。普通の英語では、PHP開発者は極端な量のコードを実行することなく、開発者が「状態を維持する」ことが基本的に簡単にできるスーパーグローバルを作りました。

これはセッションスーパーグローバルを使用する方法です。これは(他の多くのものの中で)している何

<?php session_start(); ?> 

は、特定のユーザーのコンピュータ上にクッキーを保存します。あなたのウェブサイトの各ページの上部に、あなたは(さえ<!DOCTYPE html>上記)のコードのこの部分を持っているでしょうセッションが有効である間、彼は一意になります。あなたが持っている、あなたは以下のコードが含まれるすべてのページに今

<?php 

$username = $_POST['username'];//obtaining username from form 
$password = $_POST['password'];//obtaining password from form 
// i did not include any encryption code in this example 
// so that the example is easier to understand, but keep in mind 
// that encrypting your users passwords is super important 

//for security reasons, I used prepared statements and binding parameters 
//to compare the password and username obtained from the form with 
//those in the database (in order to prevent sql injection): 
$sql = "SELECT 1 FROM users WHERE username = :username AND password = :password LIMIT 1"; 
$stmt = $conn->prepare($sql); 
$stmt->bindParam(':username', $username); 
$stmt->bindParam(':password', $password); 
$stmt->execute(); 

if ($stmt->rowCount()>0)//if a row was found, then you know this user exists 
{ 
//here I am saving information in the session super global that 
//can be used to not only identify if a user is logged in on each 
//page, but also to see which user is logged in, since often 
//you want to give a user his own control panel or other features. 
    $_SESSION['authenticated'] = TRUE; 
    $_SESSION['username'] = htmlspecialchars($username); 
} 

?> 

はNOW ...ユーザーがログインした後に入るページのは、次のようなコードを持っています
<?php 
if (isset($_SESSION['authenticated'])) 
{ 
    echo "Hello there ".$_SESSION['username']."!<br>"; 
} 
?> 

前のコードでは、「Hello there John!」のようなメッセージが返されます。ユーザー名がJohnの場合ここからは、ユーザがログインしただけにしたい括弧の中にコードを含めることができます。あなたはログインしていないので、サイトを見ることはできますが、ウェブサイトのその部分を見ることはできませんロゴ、および条件付きのの内部にないすべてのものが含まれます。また、前のコードは一番上にある必要はなく、<?php session_start(); ?>だけが必要であり、これはHTTPプロトコルの仕組みに関する理由からです。

これが役に立ったかどうか、他にご質問がありましたら教えてください。

+0

これを試してみましたが、次のエラーが発生しています:致命的なエラー:メンバ関数prepare()を/home/a4049291/public_html/frontpage.htmlの14行目以外のオブジェクトで呼び出します。14行目は - $ stmt = $ connection-> prepare($ sql);初心者の下にクラスはありますか? – Paul

0

上記のWebengの答えは、あなたが必要とするものの大部分を占めていますが、準備したステートメントを適切に使用できるように、データベース接続の仕組みを調べる必要があります。 PDOまたはmysqliデータベース接続を調べます。

ユーザーがログインしているかどうかを追跡するためにSESSION変数を使用すること、およびSQLにプリペアドステートメントを使用することについてはまったく正しいです。

私が彼の答えについて変えるべき点は、各ページのトップです。私は、代わりにこれを使用するので、ユーザーは、ページのロードが、それらは、ログインページに戻って送信されるときにログインしていない場合:

if (!isset($_SESSION['username'])) { header("Location: login.php"); } 
関連する問題