ASPプログラミングでは、本人認証がよく使われると言えます。しかし、どうすれば認証セキュリティを実現できるのでしょうか?
フォーム送信ページ: sub.htm
<html>
<頭>
<title>管理者ログイン</title>
<本文>
<フォーム名=form1 メソッド=ポストアクション=sub.asp>
<p>管理者:
<入力タイプ=テキスト名=ユーザーIDサイズ=25最大長=20>
パスワード:
<入力タイプ=テキスト名=パスサイズ=12 最大長=20>
<入力タイプ=送信名=送信値=送信>
</p>
</form>
</body>
</html>
SUB.asp プログラム
<%
フォームからデータを受け取る
user=request.from(ユーザーID)
フォームによって送信されたデータが空かどうかを確認します (JAVASCRIPT または VBSCRIPT を使用してフォーム ページを制御できますが、ここで制御することを忘れないでください。
if user= then
エラーメッセージのページへ行ってください!
応答.リダイレクト err1.htm
この文は役に立たないかもしれませんが、追加すると良いでしょう。
応答.終了
終了する場合
pass=request.from(パス)
if pass= then
応答.リダイレクト err2.htm
応答.終了
終了する場合
データベースに参加する
file=server.mappath(データベース)
set conn=server.createobject(adodb.connection)
dr=driver={Microsoft アクセス ドライバー (*.mdb)};dbq=&file
conn.open dr
set rs=server.createobject(adodb.recordset)
ここで重要なのは SQL 言語です
sql=select * from table where user= &user& and pass= &pass&
rs.opensql
そうでない場合は、
見つかったら管理ページにアクセスしてください。
応答.リダイレクト ログイン.asp
それ以外
見つからない場合は、エラー ページが表示されます。
応答.書き込み err3.htm
終了する場合
%>
上記のコードは問題ないはずだと誰もが感じますが、ここには重大なセキュリティ リスクがあります。
管理者としてログインしたい場合は、SUb.htm フォームの入力ボックスに次のように入力します。
最初のテキスト ボックスに「a または 1 = 1 または OR =」と入力します。
2 番目のテキスト ボックスに「a または 1 = 1 または OR =」と入力します。
提出してください、誰もが見るでしょう...ああ、聞いてください、わかりました、後でレンガを投げます...
a と 1 は任意の文字です
管理者として入力するのになぜこれらの文字を入力するのかと疑問に思う人もいるかもしれません。 ?
実際、これらの文字はプログラム内の SQL 言語を欺き、正常に入力するために使用されます。
ご覧のとおり、開始プログラム SQL では、user= &user& および pass= &pass& 条件を満たすレコードについてテーブルがクエリされます。
sql=select * from table where user= &user& and pass= &pass&
上記のコードを入力すると、次のようになりました。
sql=select * from table where user= a or 1 = 1 and pass= a or 1 = 1
入れない理由はありますか? ?まず入らない理由を教えてください!
上記の USER PASS フィールドは文字タイプですが、数値タイプの場合も同様です。
解決:
1. 関数置換方法:
制御目的を達成するために、ユーザーが入力したコンテンツに含まれる特殊文字を置換するには、REPLACE を使用します。 sql=select * from table where user= &replace(user, , )& and pass= &replace(pass, , )&
この方法では、一度に 1 文字しか置換できません。実際には、危険な文字だけでなく、>、<、&、% などの文字も制御する必要があります。しかし、REPLACE 関数が使用できないような場合はどうすればよいでしょうか? ?
2. プログラム制御方法
プログラムを使用してクライアントが入力するすべてのコンテンツを制御し、ユーザーが入力する可能性のある危険な文字やコードを完全に制御できるようにします。これが私の方法です。
<%
ユーザーが送信したフォームのコンテンツをキャプチャする
ユーザー=リクエスト.フロム(ユーザー)
pass=リクエスト.フロム(パス)
...
ループ制御開始
for i=1 から len(user)
MID 関数を使用して、変数 user の位置 i にある文字を読み取ります。
us=mid(ユーザー,i,1)
読み取った文字を比較する
us= または us=% または us=< または us=> または us=& の場合
上記の文字が含まれている場合、エラー メッセージが表示されます。上記の特殊文字を含めることはできません。
応答.リダイレクト err2.htm
応答.終了
終了する場合
次
...
%>