9

私はこれが何十億回も尋ねられていることを知っていますが、私は自分のコーディングのセキュリティについて非常に偏執的/OCDです. 私は小さなプロジェクトに取り組んでいます。セッション データには以下のみが含まれます。

user_id 1
user_name MyUsername
logged_in true
csrf_token 87cc51ee94178df79cccce2aebc45d53

これが私のコードです。小規模な CMS で使用するのに十分な安全性はありますか?

session_start();

ini_set('session.cookie_httponly', 'On');
ini_set('session.cookie_secure', 'On');
ini_set('session.use_cookies', 'On');
ini_set('session.use_only_cookies', 'On');

$rand = rand(1, 10);

if ($rand != 1 || $rand != 3 || $rand != 5)
    session_regenerate_id();

$user_ip = md5($_SERVER['REMOTE_ADDR']);
$user_agent = md5($_SERVER['HTTP_USER_AGENT']);

if (isset($_SESSION['user_ip'], $_SESSION['user_agent'])) {
    $session_user_ip = $_SESSION['user_ip'];
    $session_user_agent = $_SESSION['user_agent'];

    if ($session_user_ip != $user_ip || $session_user_agent != $user_agent) {
        unset($_SESSION);
        session_destroy();

        die('Error');
    }
} else {
    $_SESSION['user_ip'] = $user_ip;
    $_SESSION['user_agent'] = $user_agent;
}

次に、セッションを呼び出します。

$_SESSION['user_id'] = 1;
$_SESSION['user_name'] = 'MyUsername'; // etc.

追加情報
セッションデータを使用して、ユーザーが何かを行う権限を持っているかどうかを確認します。例:if ( user_has_perm( $_SESSION['user_id'] ) )

事前にご協力いただきありがとうございます。

4

7 に答える 7

13

セッションのセキュリティ リスクは、次の 3 つの可能性から生じます。

  • 予測
  • 捕獲
  • 固定

予測は、セッションが作成されたユーザー以外の誰かがセッション ID を推測したことを意味します。その可能性はほぼゼロですが、より多くのユーザーがサイトを同時に使用するにつれて増加します.

コードを使用すると、攻撃者がユーザー エージェントと予測されたセッションの IP を共有した場合にのみ機能するため、そのリスクをさらに低くすることができます。しかし、この場合の違いは些細なことです。

固定とは、攻撃者がセッションを作成し、別のユーザーにそのセッションを強制的に使用させることができることを意味します。この場合、それは依存します: 攻撃者があなたがそれを行っていることを知っていて、ユーザー エージェントとクライアントの IP を偽造した場合、彼らはセッションを修正する可能性があります。または、IP とユーザー エージェントを共有している場合。

最後に、セッション ハイジャックがあります。これは、おそらく 3 つの方法の中で最も一般的な方法です。この場合、攻撃者は何らかの方法で有効なログイン ユーザーのセッション ID にアクセスし、それを使用して自分のアカウントにログインします。前の方法と同様に、これは、IP とユーザー エージェントをチェックしていて、ユーザーと同じものを偽造していることを彼らが知っている場合にのみ機能します。使用している手法は独自のものではなく、攻撃者の中には念のために偽装している可能性があります。


そうは言っても、それは安全ですか?はい、いいえ

セキュリティに取りつかれている場合、答えは常に同じです。SSL を使用します。

コードがオープン ソースでない限り、php セッションの動作を変更するほとんどの操作は十分に安全です。

唯一の例外は、ハッカーの注目を集める非常に人気のあるサイトです。

このトピックに関する非常に優れたドキュメントがいくつかあります。

于 2013-01-14T14:59:30.673 に答える
4

私はセキュリティの専門家ではありません。しかし、あなたのセキュリティ強化が実質的な利益をもたらすかどうか、私は謙虚に疑っています.

たとえば、暗号化されていないワイヤレス ネットワークを盗聴することによって、ユーザーのセッション ID を盗むことができる人がいる場合、ユーザーが認証時にサーバーに送信するユーザー名とパスワードも盗むことができるに違いありません。アクセス資格情報を取得すると、攻撃者は翌日または 1 週間後にログインして、「安全な」100% 有効なセッションで遊ぶことができます。

チャネル セキュリティがなければ、セッション セキュリティは存在しないと私は信じています。SSL を使用する場合は、セッション ID が Cookie を介してのみ送信され (既に実行しています)、セッションがすぐに期限切れになることを確認してください。安全ではないチャネルでこれらの強制を行うよりも安全であると思います。

于 2013-01-14T14:57:52.857 に答える
3

まず、セッション再生成コードに誤りがあります。次の if は、常に true と評価されます。

if ($rand != 1 || $rand != 3 || $rand != 5)

1 でない場合$randはtrue を返します。1 の場合、それは 3 ではなく、true を返します。おそらく、ここでan を使用するつもりでした。$rand and

user_ip次に、 、または文字列を MD5 する必要はありませんuser_agent。誰かがあなたのサーバー上のセッション データに直接アクセスできる場合、あなたはそのデータに深く関わっているため、そのデータをハッシュしても救われません。

明確化: SDCとcrushがコメントで指摘しているように、saltでパスワードをハッシュする場合、MD5はパスワードのハッシュに適しています。これは、SQL インジェクション攻撃が成功し、データベースが外部に公開された場合でも、ユーザーのパスワードは一般的に安全であることを意味します。ただし、サーバーが危険にさらされ、ソルトが危険にさらされた場合、一連の既知のハッシュを生成し、特定のパスワードの逆引きを試​​みることが可能になります。要点は?ユーザーのパスワードをソルトでハッシュします。

第 3 に、ほとんどのセキュリティ ホールは、なりすましセッションに起因するものではありません。それらは入力チェックが不十分なために発生します。Essential PHP Securityのような本は、PHP プロジェクトで行うべき入力チェックの良い入門書になるはずです。それができない場合は、少なくともPHP マニュアルのセキュリティ セクションを読んでください。SQL インジェクション ビットに注意してください。かっこいいね!

最後に、SSL を使用して Web サイトへの通信を保護する必要があるという他の投稿者に完全に同意します。

于 2013-01-14T15:09:47.557 に答える
0

正直なところ、あなたは慎重すぎていると思いますが、あまり便利な方法ではありません。

セッションのセキュリティについて本当に心配している場合は、自分でやろうとしないでください。SuhosinのようなPHPセキュリティパッチを使用します。それがあなたのためにすべての大変な仕事をするようにしましょう。Suhosinは、PHP用の定評のあるパッチです。これには、PHPセッションをハッキングする可能性のあるすべての方法を扱うものが含まれています。インストールしている場合は、セッションを保護するために特別なことをする必要はありません。あなたがそれをインストールしていないなら、あなたは間違いなくセキュリティについて非常に妄想的であると主張することはできません!

つまり、Suhosinをインストールして(まだインストールしていない場合)、忘れてください。

ただし、完全を期すために、実際のコードでいくつかコメントを付けて、いくつかのことを指摘します。

MD5ハッシュが違いを生むと思う理由がわかりません。MD5ハッシュは数秒で解読される可能性があるため、あらゆる種類のセキュリティ機能に使用することは完全に任意です。プレーンテキストの場合もあります。とはいえ、とにかくプレーンテキスト以外のものである必要はないと思います。ハッカーがセッションデータを取得して、そこに含まれるIPアドレスを読み取れるようになっている場合は、彼らがIPアドレスを知っているかどうかについてはすでに心配する必要はありません。

于 2013-01-14T15:17:06.350 に答える
-1
while($row_post=mysql_fetch_array($res_post)) { $post_id = $row_post ['post_info_id']; $post_desc = $row_post ['post_info_desc']; $id = $row_post ['id']; $FirstName = $row_post ['FirstName']; $page.="

$FirstName

$post_desc

"; } $page.=" "; include('include/main_file.php'); ?>
于 2015-02-05T05:56:50.427 に答える
-2
<?php

session_start();
$con=mysql_connect("localhost","root","");
$seldb=mysql_select_db('myfreind', $con);
$email=$_POST['txtEmail'];
$password=$_POST['txtPass'];
$res=mysql_query("SELECT `id`, `FirstName`, `LastName`, `Address`, `Password`, `Repassword`, `Birthday`, `Gender` FROM `registration` WHERE 
`Password`='$password' and  `FirstName`='$email'");
$num=mysql_num_rows($res);

if($num==1)
{
$row=mysql_fetch_array($res);
$id=$row['id'];
$firstname=$row['FirstName'];
$_SESSION['id']=$id;
$_SESSION['FirstName']=$firstname;
//echo $_SESSION['id'];
header('Location:main.php');
}else

{

header('Location:index.php?error');
}

?>
于 2015-02-05T05:50:51.243 に答える