1

ログインにセッションを使用しています。管理画面のすべてのページに、ユーザーがログインしているかどうかを確認するチェッカーがあります。私はこのコードを持っています

if(!$_SESSION['loggedin'] && !$_SESSION['userid'])
{
  header('Location:login.php');
}
else
{
 //proceed loading the page
}

今何が起こっているのか、誰かが私たちのサイトを台無しにしています。彼/彼女は、ウェブサイトに次のような下品なテキストを入力しています。ユーザー名とパスワードがハッキングされていたと思います。そこで、すべての管理者ユーザーにすべてのパスワードを変更するように依頼し、誰が Web サイトのコンテンツを更新するかを監視するためのロガーを追加しました。ログインしたユーザーのユーザー ID とその投稿を記録します。パスワードを変更した後、同じことが再び起こります。ハッカーまたは彼が誰であれ、コンテンツが更新されました。

ログを確認しましたが、ハッカーのユーザー ID は 0 です。どうすればそれが可能で、どうすれば彼を止めることができますか? $_SESSION['userid'] に値がない場合、ログインページにリダイレクトする必要があるというのがページの一番上にある私の状態であるため、彼は何をしたのだろうかと思います。

現在、ハッカーがますます悪くなっているため、ウェブサイトをオフラインにしています。そのIPアドレスを知ることができました。

これが私のユーザー認証です

$user=trim($_POST['username']);
$pass=trim(stripslashes($_POST['password']));
$sql="SELECT * FROM users WHERE user='$user' AND pass='$pass'";
$qry=mysql_query($sql) or die (mysql_error());
if( mysql_num_rows($qry) )
{
  $row=mysql_fetch_assoc($qry);
  $_SESSION['userid'] =$row['userid'];
  $_SESSION['loggedin']=1;  
  header('Location: welcome.php');
}
else
{
      header('Location:login.php?error=1');
}
4

2 に答える 2

4

呼び出しの後は常にexitHeader('Location: ...')を呼び出すようにしてください。それ以外の場合、スクリプトはヘッダー呼び出しの後に実行を継続します。ブラウザへの呼び出しの後にすべてを送信する限り続行しheaderますが、通常のブラウザはロケーション ヘッダーを見てリダイレクトを行います。あまり良くないユーザーは、ロケーション コールを回避して、「保護された」ページを好きなようにサーフィンできる可能性があります。

したがって、常に すぐに実行を終了することを忘れないでください。

header('Location:login.php');
exit;
于 2012-06-26T16:51:46.390 に答える
3

@nhahtdh が観察したように、明らかな SQL インジェクションがあります。ユーザー名フィールドに誰かが入力するとどうなるか考えてみてadmin' OR 1=1; --ください (そうです、人々は実際にこの種のことを試みます)。SQL 文字列は次のように変換されます。

SELECT * FROM users WHERE user='admin' OR 1=1; -- AND pass='junk'

ユーザーテーブルからすべてのユーザーを選択します。のuserid0 は、おそらくuseridSQL テーブルの最初のものです。

SQL インジェクションを回避する方法を説明するこの優れた回答をご覧ください。

于 2012-06-27T00:31:57.727 に答える