1

ログイン情報の共有が許可されていない Web サイトを運営していますが、これらのユーザーを防ぐためのシステムは構築されていません。現在、管理者は共有している人のレポートを求めています。統計データベースを分析すれば、それらを見つけることができると確信しています。

共有ログインを検出するための私のアイデアは、毎月末に統計テーブル (MSSQL 2008) にクエリを実行し、容疑者のリストを作成することです。それらをキャッチするには、「スイッチング」セッション/IP アドレスを表示するクエリが必要です。

たとえば、次のことが許可されています。

DateTime, UserId, SessionId, IpAddress
12Feb13 16:30, 10, ABC, x.x.x.x
12Feb13 16:32, 10, ABC, x.x.x.x
12Feb13 16:34, 10, DEF, y.y.y.y
12Feb13 16:36, 10, DEF, y.y.y.y

以下は許可されていません。

DateTime, UserId, SessionId, IpAddress
12Feb13 16:30, 10, ABC, x.x.x.x
12Feb13 16:32, 10, DEF, y.y.y.y
12Feb13 16:34, 10, ABC, x.x.x.x
12Feb13 16:36, 10, DEF, y.y.y.y

問題は、何千ものエントリを照会するときにこれを効果的に行う方法です。

4

1 に答える 1

2

注:以前の CTE の回答を消去しました。それを機能させる唯一の方法はLAG、SQL 2008 では利用できない which を使用することだったからです。

以下は、データを 2 つの CTE に分割します。1 つ目はユーザーの sessionID が発生する時間の範囲を返し、2 つ目は IP アドレスの範囲を返します。セッションが IP アドレスの範囲内で開始され、その範囲外で終了した場合、そのセッションは別の IP アドレスの一部である必要があります。同様に、セッションが ip の前に開始されたが、ip 内で終了した場合も悪いことです。

このソリューションでは、sessionID はユーザーごとに 1 回しか使用できないと想定しています。つまり、IP のセッションが終了すると、ID 番号は後で使用できなくなります。

SELECT s.UserId, s.SessionId, s.IpAddress, i.IpAddress, s.MinDate [sMin], s.MaxDate [sMax],
    i.MinDate [iMin], i.MaxDate [iMax]
FROM (

    SELECT UserID, SessionID, IPAddress, MIN(DT) MinDate, MAX(DT) MaxDate
    FROM #USERLOG  
    GROUP BY UserID, SessionID, IPAddress

) AS s
INNER JOIN (
    SELECT UserID, IPAddress, MIN(DT) MinDate, MAX(DT) MaxDate
    FROM #USERLOG ipLog 
    GROUP BY UserID, IPAddress
) AS i ON 
    s.UserID = i.UserID 
    AND s.IpAddress != i.IpAddress
    AND (
        (s.MinDate < i.MaxDate AND s.MaxDate > i.MaxDate) OR 
        (s.MinDate < i.MinDate AND s.MaxDate > i.MinDate))

UserID, Session, IPAddress最高のパフォーマンスを得るには、とのインデックスが必要ですUserID, SessionID

于 2013-09-05T14:49:02.033 に答える