• ベストアンサー

レガシーASPの、携帯ブラウザからのセッション維持について

レガシーASPの、携帯ブラウザからのセッション維持について 現在、レガシーASPでWEBメーラーを改造しております。 このメーラーはもういない先輩が作成したもので、パソコンでの使用を目的に組まれました。 これを携帯のブラウザからでも使用できるように改造しなければならず、現在問題点を確認しております。 しかし、レガシーASPだとクッキーでセッションを維持しているが、ドコモのブラウザはクッキーに対応していないということを聞きました。 ASPのソースを見たところ、セッション関数を使ってDBやフォルダからデータをとってきているらしく、このままでは動きません。 いっそASP.NETに移行し、Cookielessを使用したほうがいいでしょうか? それとも、レガシーASPに、セッションの代わりになる方法などがありますでしょうか? 下にソースコードの一部を書きます。 当方プログラミング未経験のため、どこをどうすれば良いかも教えていただけると嬉しいです。 よろしくお願いします。 ' ログインチェック sub s_LoginChk() dim l_user,l_password dim l_msg,l_sql,l_url l_user = Request("p_name") l_password = Request("p_password") Session("s_user")=l_user l_msg ="" if l_msg ="" then l_sql = "SELECT l_id FROM mail.dbo.tbl_login WHERE " l_sql = l_sql & "l_name='" & l_user & "' AND " l_sql = l_sql & "l_pass='" & l_password & "' " i_Recs.Open l_sql,i_Conn ' データベースに問い合わせOK if NOT i_Recs.EOF then Session.Timeout=120 Session("s_id")=i_Recs("l_id") l_url = "mail.asp?p_opt=TopMenu" Response.Redirect(l_url) end if i_Recs.Close end if end sub ' トップメニュー sub s_TopMenu() Dim l_day,l_sql Dim l_id,l_sdate,l_edate,l_title if Session("s_id")="" then call s_SessionEnd() exit sub end if %> <form action=mail.asp method=post> <FRAMESET ROWS="100,*"FRAMEBORDER="no"> <FRAME SRC="sample1_top.html" SCROLLING="no" NORESIZE> <FRAMESET COLS="150,*" > <FRAME SRC="sample1_left.htm" SCROLLING="no" NORESIZE> <FRAME SRC="sample1_right.html" NAME="right"> </FRAMESET> </FRAMESET> </form> ようこそ <b><%=Session("s_user")%></b> さん <% l_day =YEAR(now)&"/"&Month(now)&"/"&DAY(now) call s_Menu() %> </table> <% end sub

質問者が選んだベストアンサー

  • ベストアンサー
noname#158371
noname#158371
回答No.1

Sessionを使わないとなると、 案1:Sessionに保持している値をページ表示毎に毎回データベースから取得するような作りに変更する(ソースコード量の膨大化が進むことは必至で、保守性が下がるリスクを背負います) 案2:もしくは、input type="hidden"タグに保持したい値を保存し、毎回、Requestまたは、Request.Formで取得する(保守性は保てるが、Response.Redirectを使って画面遷移している場合は、Request.Formで値を取得できない。SessionかQueryStringを使うしかありません) 案3:URLにQueryStringを使ってSessionで格納していた値を各画面に受け渡す方法 (例:http://servername.com/login.asp?s_user=xxxx&s_id=kero-mio というような、?や&を入れたURL構成で値を渡す方法をQueryStringといいますが) (ただし、QueryStringは、1024バイトまでの情報しかやり取りできないのと、URLに受け渡す値が見えてしまうため、セキュリティリスクを背負う。現行ソースの影響度は比較的少なく済むかと思います) 以上の方法しか対策がありません。 値が早々変化しないのであれば、Application変数を使うという手もありますが、ご提示されたソースコードを見る限り、利用者毎に値が違うため、Application変数を使用するのは良くないのかなと思います。 また、ASP.NETに移行して頂いても構いませんが、aspで作成された資産は殆ど使えないものだと思って下さい。(完全なる作り替えが必須となります。) また、現段階のVisual Studio の最新版である、「Visual Studio 2008」は、ASP.NETを使ったモバイルWebアプリケーション開発指針がハッキリしていないこともあり、もし、ASP.NETに乗せ換えてモバイル対応Webアプリケーションを作成するのであれば、「Visual Studio 2005」の利用をお勧めします。 ※Visual Studio 2010の発売まで待てるのであれば、2010を使っても構いませんが、2010についても、ASP.NET用モバイルWebアプリケーションの開発情報がハッキリしない状況です。 以上の点を踏まえ、ご検討ください。

nirarebas
質問者

お礼

kero-mioさん、お礼が遅れて申し訳ございません。 詳しく丁寧なご返答ありがとうございます! 案1はソースコードがちょっと怖いものになりそうですね。検討してみます。 案2は、Response.Redirectを使用しているので見合わせようと思います。 案3は、たしかにソーシャルエンジニアリングが怖いですが、弊社社員用のメーラなので、教育がしっかりできれば問題ないと思います。 ASPならびにASP.NETに関してまるで知識がなかったため、aspで作成された資産は殆ど使えないものだとお聞きしてびっくりしました。 また、案3のように、ASPでクッキーレスのようなことができるという情報もすごく助かりました。 検討はもう少し続けますが、おそらく、案3を採用させていただきます。 セッションハイジャックにだけ気をつけて(ドコモの新ブラウザでRefererが使用できるようになった〔しかもデフォルトon〕のがすごく怖いです)、あとは社員教育で情報漏えいには対処しようと思います。 すごく助かりました。 本当にありがとうございました。

その他の回答 (1)

回答No.2

表題とは関係ありませんが、セキュリティの問題点を指摘させてください。 お示しのコードでは、有名な「SQLインジェクション」が可能のようです。 http://www.atmarkit.co.jp/fsecurity/column/ueno/42.html あくまで例としてのコードであり、SQLインジェクション対策はバッチリならというのでしたら、読み流してください。

nirarebas
質問者

お礼

アドバイスありがとうございます。 あくまで非公開の社内用プログラムということで、仕様ミスやヒューマンエラーによる内部からの漏えいは想定していたのですが、外部からの攻撃に関しては失念しておりました。 SQLインジェクション攻撃に関してはネットニュース等で漠然と聞いたことがある程度だったのですが、これを機に、教えていただいたURLを熟読し、しっかりと書籍などでもセキュリティに対して学習を進めていこうと思います。 ありがとうございました。

関連するQ&A

  • セッション

    セッションについて教えて下さい。 指定のID、パスワードでログインしようと思っています。 ソースを記載しますので、お教え下さい。 ID:aaa パスワード:111とします。 [送り側フォーム] <form action="/test2.asp" method="POST" id=form1 name=form1> <input type="text" name="id" value=""><br> <input type="password" name="passwd" value=""> <input type="submit" value="LOGIN" id=submit1 name=submit1> </form> とし、 [受け取り側、認証 test2.asp ] <% If Session("user_test") <> "1" Then Response.Redirect "/test.asp" Response.End() End If %>ここで認証を判断し、認証できなければtest.aspへもどるとし、 Dim id, passwd id = Request.Form("id") passwd = Request.Form("passwd") Session("user_login") = "id" Session("user_login") = "passwd" IF id = "aaa" and passwd = "111" THEN Session("user_test") = 1 Response.Write ("OK") ELSE Response.Write ("ちがうよ") END IF %> ID、パスワードをセッション変数にいれ、各ページで認証すると言う事をやりたいのですが、うまくいきません。 どこがわるいか、お教え下さい。 ※以前にも似たような質問をしているのですが、改善されずお手上げです。

  • asp.netでのセッションを使用したログイン

    asp.netでmssql server を利用してログイン機能を実装しました。 以下のようなコードでmssqlに保存してあるIDとパスが一致すれば 以降の画面ではセッションにID、パスが保存され page loadでセッションにID、パスがなかればページがすすんでいけないような設定にしています。 機能は問題なく動作しているのですがこのような仕様はセキュリティ上問題はないのでしょうか。 商用サイトではないのですが、ある程度広域に向けたサイトを構築しようと考えておりまして、セキュリティ向上のため、工夫できるようなことがあればご意見いただきたいです。 よろしくお願いいたします。 ************************************************************** ログインページ ************************************************************** Dim staffid As Integer Dim staffname As String Dim adminflag As Boolean Protected Sub btnLogon_Click(ByVal sender As Object, ByVal e As System.EventArgs) 'ユーザーIDの入力チェック If txtUserID.Text = "" Then lblErr.Text = "ユーザーIDを入力してください。" Return End If 'パスワードの入力チェック If txtpassword.Text = "" Then lblErr.Text = "パスワードを入力してください。" Return End If 'ユーザーとパスワードの検証 If Not CheckUserPassword(txtUserID.Text, txtpassword.Text) Then lblErr.Text = "ユーザーIDまたはパスワードが違います。" Return End If 'セッション変数へ値をセットする Session("StaffID") = staffid Session("StaffName") = staffname Session("AdminFlag") = adminflag End Sub Private Function CheckUserPassword(ByVal userid As String, ByVal password As String) As Boolean Dim ret As Boolean Dim strSQL As String strSQL = "SELECT staffID, staff_name, admin_flag , permission FROM tbl_staff " & _ "WHERE userID = '" & userid.Replace("'", "''") & _ "' AND password = '" & password.Replace("'", "''") & "'" '接続文字列を取得する Dim cnStr As String = System.Configuration.ConfigurationManager.ConnectionStrings("hogehogeConnectionString").ConnectionString() 'コネクションを定義する Using connection As New SqlConnection(cnStr) 'コマンドを定義する Dim command As New SqlCommand(strSQL, connection) 'コネクションを開く connection.Open() Try 'コマンドからデータリーダーを定義する Dim dr As SqlDataReader = command.ExecuteReader 'データリーダーから結果を読み込む If dr.Read Then '対象データが存在する場合 '正しいユーザーIDとパスワードが指定されたので、 'データリーダーから読み出したデータをメンバ変数にセットする staffid = dr("staffID") staffname = dr("staff_name") adminflag = dr("admin_flag") permission = dr("permission") ret = True Else '対象データが存在しない場合 '不正なユーザーIDまたはパスワードが指定された ret = False End If Catch ex As Exception '例外処理(SQLエラーなど) ret = False End Try 'コネクションを閉じる connection.Close() End Using '結果を返して終了する Return ret End Function ************************************************************** ログイン後に行くページでの設定 ************************************************************** Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) '[ユーザーID]ボックスにフォーカスをセットする If Session("StaffID") Is Nothing Then Response.Redirect("~/top.aspx") ElseIf Not Session("AdminFlag") = True Then Response.Redirect("~/top_normal.aspx") End If End Sub

  • ページを一度更新しないとSession値が渡らない。

    ASPで初めてプログラムしています。 A.asp → Err.inc → Err.asp というように、エラーがあったらErr.aspに 遷移するようにしているのですが、 Err.aspで更新ボタンを押さないとSession値が表示されません。 具体的に *** Err.inc *** <% Sub COMM_USER_ERROR(strMsg)   session("ErrMsg") = strMsg   'システムエラー表示   Response.Redirect("Err.asp")   Response.End End Sub %> *** A.asp *** If Request.ServerVariables("REQUEST_METHOD") <> "POST" Then   Call COMM_USER_ERROR("不正なアクセスをしました") End If *** Err.asp *** <HTML>   (中略)   <%=session("ErrMsg")%> どうしたらよいか全くわかりません。 どなたか教えていただけないでしょうか? よろしくお願いいたします。

  • ASPのログイン制限に関する質問です

    現在ログイン制限のページを作成しているのですがユーザーIDとパスワードを入力した情報を現在作成している関数に渡すとエラーがおきてしまいます。原因がわからないので助言をお願いします。 SQLの定義ですがすべてvarcharです。 以下コード ---------------------------------------------------------- 'ログイン画面からのデータを取得 user_id = Request.form("user_id") password = Request.form("password") function user_check(user_id, password) set objCon = Server.CreateObject("ADODB.Connection") set objRS = Server.CreateObject("ADODB.Recordset") objCon.ConnectionString = "DSN=・・・・;"& _ "UID=root;" & _ "PWD=・・・・・;" objCon.Open '入力した情報と一致するものを探す strSQL = "select person_code, password from person_master" & _ "where code = '" &user_id& "' and password = '" &password& "'" objRS.Open strSQL, objCon, 3 If objRS.EOF or objRS.BOF then user_check = "NG" else user_check = "OK" end If objRS.close set objRS = nothing objRS.close set objCon = nothing end function if user_check(user_id, password) <> "OK" then response.redirect "index.asp" else response.redirect "main.asp" end if

  • データ受け渡し時の維持

    いつもお世話になっております。 現在A.aspからB.aspにデータを渡したいと考えているのですが、その間にユーザ認証の処理"C.asp"を入れているため、上手く渡りません。 Aで送ったデータをCが処理している間も持ち続け、Bに渡したいのです。Cはシステム上、他のファイルも参照するファイルなので、できればAもしくはBのみに手を加えることで解決したいと考えております。 現在の状況として、ユーザ認証直後は真っ白なBの画面が出て、再度Aに戻ってもう一度Bに飛ぶと認証済みのため、Aのデータ"hoge"がBにきちんと表示されます。 簡単で申し訳ありませんが、下記にソースを書きます。 何かお気づきの点があれば、ご教授ください。 宜しくお願い致します。 ※A.aspの内容 <% Response.Write "<a href=""B.asp?key=hoge""> B.aspへ</a>" %> ※B.aspの内容 <!--#include VIRTUAL="C.asp"--> <html> <head> <%Dim key2 key2 = Request.QueryString("key") %> </head> <%Response.Write url2%> </HTML> ※C.aspの内容 (長いので抜粋です) <%Option Explicit%> <%Response.Buffer = True Sub chkUser_Main() If chkUser_VerifyAuthorization() = False Then Response.Clear Session.Contents("LoginCaller") = Request.ServerVariables("SCRIPT_NAME") Response.Redirect "/login.asp" Response.End End If End Sub Function chkUser_VerifyAuthorization() chkUser_VerifyAuthorization = False Dim tUid, tPswd tUid = Session.Contents("SessionKey") tPswd = Session.Contents("Password") If (tUid = "") Or (tPswd = "") Then Exit ...続く

  • ASP+SQLにてSessionがNullになる

    Windows 2000 Server環境でIISにて次のような問題に遭遇しています。 ~calendar.asp~ If Request("year") <> "" Then Session("STR_DATE") = Request("year") & "/" & Request("mon") & "/" & Request("day") End If と、上記のような記述があり、STR_DATEの値が代入されています。 にも関わらず、SQLを実行するとSTR_DATEがNullになってしまいます。 SQL = "INSERT INTO SCHEDULE([DATE],[CATEGORY],[NAME],[COMMENT]) VALUES ('" & Session("STR_DATE") & "','" &Request("category") & "','" &Request("name") & "','" & Request("comment") & "')" OBJ.Execute(SQL) 結果、日付(DATE)がNullでレコード追加されてしまいます。 ASP全文を掲載すると長文になってしまうので、一部抜粋して掲載しました。 情報不足は承知しておりますが、お知恵をお借りできませんでしょうか。 宜しくお願いいたします。

  • PHPのセッションについて

    PHPのセッションについて 現在ログインフォームを作成しているのですが、 ログインフォームからIDとパスワードを送信して、合っていれば セッションを発行してロケーションで飛ばそうと思っているのですが、 初回時にIDとパスワードを入力して送信しても、セッションが引き継がれず 2回目以降だとセッションが引き継がれる症状に悩んでおります。 どなたかご教授ください。 宜しくお願いいたします。 【login.php】-------------------------------- <?php session_name("stock"); session_start(); $error_flag = 0; if(isset($_POST["login"])){ $id = htmlentities($_POST["id"],ENT_COMPAT); $password = trim(htmlentities($_POST["password"],ENT_COMPAT)); if($login_id == $id && $login_pass == $password){ $_SESSION["id"] = $id; $_SESSION["password"] = $password; header("Location:stock.php"); exit; }else{ $error_flag = 1; } } echo <<<EOD <form method="post" action="login.php" id="login"> <input type="text" name="id" id="id" > <input type="password" name="password" id="password"> <input type="submit" name="login" value="ログイン" /> </form> EOD; 【stock.php】--------------------------------- <?php session_name("stock"); session_start(); echo $_SESSION["id"]; echo $_SESSION["password"]; ?>

    • ベストアンサー
    • PHP
  • セッション

    phplibを使わないでユーザ認証を用いたwebサイトを作ろうと思います。 shinki.php => login.php => contents1.php=> contents2.php .... のような流れの構造で、直接contents1.phpなどに入られないようにセッションを使用したいと思います。 ユーザが持っているセッション名と、サーバー側のセッション名が一致するという条件だけでログインしたユーザと考えていいのでしょうか? 現在はこのような感じになっています。 まずshinki.phpでユーザー登録します。この時ユーザ情報と暗号化されたパスワードをDBに保存。 login.phpでユーザIDとパスワードを入力し、DBのデータと一致するとcontents1.phpに進む。この時セッションを発行し、idと暗号化されたパスワードをセッションに記憶させる。 contents(1 | 2).phpのコード <? session_start(); // PostgreSQL 接続 if (!($cn = pg_connect("dbname=****"))){die;} // SQL文 $sql = "select * from ***** where id='$_SESSION[id]'"; if (!($rs = pg_exec($sql))) {die;} $ct = pg_numrows($rs); for ($i = 0; $i < $ct; $i++) { $array = pg_fetch_array($rs, $i); } // セッションのパスワードとデータベースのパスワードが一致 if($_SESSION[pass] == $array['pass']){ login_html(); }else{ print "ログインしてください。"; } // PostgreSQL 切断 pg_close($cn); function login_html(){ print "<html><head><title><title></head><body>"; .... .... } ?> このような構造には、セキュリティー的な問題はあるのでしょうか? おそらくいろいろ問題があると思いますので、ご指導お願いします。 一般的なパスワード制のページではどのような処理をしているのでしょうか? よろしくお願いします。 os:linux httpd:apache1.3.27 postgreSQL php4.x.x

    • ベストアンサー
    • PHP
  • セッションについて教えてください。

    PHPを独学で勉強中の初心者です。(HTMLとCSSくらいしか分からない所からのスタートです) ログインフォーム→パスワード処理→コンテンツ表示というながれで作っています。 質問は、セッションの有効期限はデフォルトではブラウザを閉じるまでと聞いたのですが、それはウインドウを閉じるではなく、アプリケーションを終了するまでということでよいのでしょうか?ウインドウを閉じただけだと、コンテンツを表示できてしまいます。 また、コードがこんなんでよいものかアドバイスよろしくお願い致します。 --パスワード処理-- <?php session_start(); $id =p; $password =11; $n_id = $_POST["n_id"]; $n_password = $_POST["n_password"]; if(($n_id == $id ) && ($n_password == $password)){ $_SESSION['pass'] = 1; header("Location: page1.php"); }else{echo "IDまたはパスワードが違います。"; } ?> ----コンテンツページ----- <?php session_start(); if(isset($_SESSION["pass"]) && $_SESSION["pass"] == 1){ echo "コンテンツ"; echo "<html><head> <meta http-equiv=Content-type content=text/html; charset=EUC-JP> </head><body>"; echo "<form action =logout.php method=post>"; echo "<input type=submit name=sbm value=ログアウト>"; echo "</form></body></html>"; }else{ header("Location:login1.php"); } ?>

    • 締切済み
    • PHP
  • ASP2.0からSQLserver2000への認証

    開発環境:VisualStudio.net2005 ASP.net DB:SQLServer2000 ログインコントロールで下記のコードを作成したところ 開発環境ではうまくいっているのですが、Webサーバーにリリースしたところうまくいきません。 ------------------------------------------------------------------------------------------------------------- Protected Sub Login1_LoggingIn(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.LoginCancelEventArgs) Handles Login1.LoggingIn ' 入力されたユーザーID、パスワードでusrテーブル内のレコードを検索 Dim objDb As New SqlConnection("Data Source=dbserver;Initial Catalog=testdb;Persist Security Info=True;User ID=testusr;PassWord=hogehoge") Dim objCom As New SqlCommand("SELECT * FROM member WHERE LoginID=@LoginID AND LoginPass=@LoginPass", objDb) objCom.Parameters.Add("@LoginID", Login1.UserName) objCom.Parameters.Add("@LoginPass", Login1.Password) objDb.Open() Dim objDr As SqlDataReader = objCom.ExecuteReader() If objDr.Read() Then ' 検索の結果、該当するレコードが存在した場合、認証は成功 FormsAuthentication.RedirectFromLoginPage(Login1.UserName, False) End If objDb.Close() End Sub ---------------------------------------------------------------------------------------------------------------- DB内のデータはとれている(objDrの中身が入ってることをデバック実行にて確認) ので、認証の部分で失敗しているのかと思い http://www.microsoft.com/japan/msdn/enterprise/pag/securityguidance/paght000010.aspx 等を参考してみたのですが、 「サーバーへの接続を確立しているときにエラーが発生しました。SQL Server 2005 に接続しているときときにこのエラーが発生した場合は、SQL Server の既定の設定がリモート接続を許可しないようになっていることがエラーの原因である可能性があります。 (provider: SQL ネットワーク インターフェイス, error: 26 - 指定されたサーバーまたはインスタンスの位置を特定しているときにエラーが発生しました) 」 というメッセージが出力されて、認証ができません。 どなたかアドバイス等ありましたらご教授できませんでしょうか。

専門家に質問してみよう