詳細は、SAC #41179 を参照してください。
403 エラーは、Web アプリケーションを操作しているときに、サーバーが受け取った変数/項目属性の値が、サーバーが送信した値と異なる場合に発生します。その値は、読み取り専用の変数/項目属性であるため、変更は許可されていません。
目的は、何者かが介入し、変更が認められていない値を POST 内で変更するという脆弱性を回避することです。
ブラウザーに表示されるメッセージは、Java または .NET のどちらを使用しているか、またオブジェクトのタイプ (Transaction オブジェクト、Web Panel オブジェクトなど) によって異なります。
アプリケーションサーバーへのアクセス中にエラーが発生しました。(403)
HTTP ステータス 403 – アクセス不可
403 アクセス不可
このエラーは、攻撃の後 (成功した場合) に返されるか、プログラミングや設定の誤りが原因になっている可能性があります。
具体的な状況を判断するには、ログが有効になっている必要があります。
ログを有効にするには、[ Log level ] プロパティ (ジェネレーターレベル) の値を「2. Error」にします。

選択するログレベルによって、出力される情報量が異なります:
- ERROR - ログには、エラーが発生したオブジェクト、変更が認められていないが変更された変数/項目属性、そしてその新しい値 (クライアントのサーバーが受け取った値) のみが含まれます。
- INFO - 上記の情報に加え、クライアントに送信された元の値が含まれます。
- DEBUG - 上記に加え、プログラム実行のコンテキストに関する情報 (例: 暗号化された値、セッション ID)、Java のスタックトレースが含まれます。複雑なシナリオでは、この情報が役立ちます。
注: ログレベルを実行時に (GeneXus IDE 以外で) 変更するために、ログ出力の設定を変更できます。詳細については、「[ Log level ] プロパティ」を参照してください。
最適なレベル
DEBUG レベルが最も情報量が多くなりますが、ログが多すぎて処理に手間取る可能性があります。また、アプリケーションのパフォーマンスなどに影響が及ぶ可能性もあります。
このエラーの場合、通常は ERROR レベルか INFO レベルで、問題を特定するのに十分です。
したがって、一般的には、少なくとも本番環境においては、ログを ERROR レベルにしておくことをお勧めします。これが、生成および処理の負担が最も少ないレベルです。あるいは INFO レベルでもかまいません。
ログファイルの処理方法
ログファイルで文字列「403」またはエラー「SecurityCheckFailed」を検索します。
どのログレベルでも、次のような行が含まれます:
Java
2020-03-10T11:28:01.557-03:00 [ http-nio-8080-exec-10 ] ERROR com.genexus.CommonUtil - customer: [ SecurityCheckFailed (403 Forbidden) value for ] "hshsalt":"hshCustomer","CustomerName":"Harry"}
.NET
2020-03-10 12:19:05,698 [ 19 ] ERROR GeneXus.Utils.GXUtil - At file: , line: 0, customer: [ SecurityCheckFailed (403 Forbidden) value for ] {"hshsalt":"hshCustomer","CustomerName":"Harry"}
ここで「Customer」はエラーが発生したオブジェクト、「CustomerName」は値が「Harry」に変更された項目属性/変数の名前です。
つまり、サーバーから送信された CustomerName の値が、クライアントから送信されたものとは異なり、後者は「Harry」だったということです。
この情報から、場合によっては問題を特定できます。
これで十分ではない場合は、ログレベルを INFO に高めると、次の情報が出力されます:
Java
2020-03-10T12:04:12.836-03:00 [ http-nio-8080-exec-48 ] INFO com.genexus.CommonUtil - customer: [ SendSecurityCheck value for ] {"hshsalt":"hshCustomer","CustomerName":"Oliver"}
2020-03-10T12:04:22.305-03:00 [ http-nio-8080-exec-49 ] ERROR com.genexus.CommonUtil - customer: [ SecurityCheckFailed (403 Forbidden) value for ] {"hshsalt":"hshCustomer","CustomerName":"Harry"}
.NET
2020-03-10 12:20:58,009 [ 7 ] INFO GeneXus.Utils.GXUtil - At file: , line: 0, customer: [ SendSecurityCheck value for ] {"hshsalt":"hshCustomer","CustomerName":"Oliver"}
2020-03-10 12:21:03,769 [ 11 ] ERROR GeneXus.Utils.GXUtil - At file: , line: 0, customer: [ SecurityCheckFailed (403 Forbidden) value for ] {"hshsalt":"hshCustomer","CustomerName":"Harry"}
これは、「Customer」オブジェクトで、「CustomerName」項目属性の値として「Oliver」が送信され、CustomerName は変更が許可されていないにもかかわらず、値「Harry」がサーバーに返されたことを示しています。
このように、クライアントに送信された値および返された値がわかります。この情報を使用して、問題を特定できる可能性があります。
この情報から問題を特定できない場合は、DEBUG レベルを有効にできます。この場合、上記にさらにコンテキスト情報が加わります。
次のようになります:
Java
2020-03-10T12:11:42.906-03:00 [ http-nio-8080-exec-5 ] INFO com.genexus.CommonUtil - customer: [ SendSecurityCheck value for ] {"hshsalt":"hshCustomer","CustomerName":"Oliver"}
2020-03-10T12:11:48.028-03:00 [ http-nio-8080-exec-6 ] ERROR com.genexus.CommonUtil - customer: [ SecurityCheckFailed (403 Forbidden) value for ] {"hshsalt":"hshCustomer","CustomerName":"Harry"}
2020-03-10T12:11:48.030-03:00 [ http-nio-8080-exec-6 ] DEBUG com.genexus.CommonUtil - send_http_error_code 403
java.lang.Throwable: null
at com.genexus.CommonUtil.writeLog(CommonUtil.java:242) [ gxcommon.jar:? ]
at com.genexus.GXutil.writeLog(GXutil.java:53) [ gxclassR.jar:? ]
at com.error403.customer_impl.standaloneStartupServer(customer_impl.java:662) [ classes/:? ]
at com.error403.customer_impl.standaloneStartup(customer_impl.java:523) [ classes/:? ]
at com.error403.customer_impl.userMain(customer_impl.java:509) [ classes/:? ]
at com.error403.customer_impl.userMainFullajax(customer_impl.java:516) [ classes/:? ]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [ ?:1.8.0_181 ]
....
.NET
2020-03-10 13:03:57,148 [ 20 ] INFO GeneXus.Utils.GXUtil - At file: d:\AppPath\customer.cs, line: 1856, customer: [ SendSecurityCheck value for ] {"hshsalt":"hshCustomer","CustomerName":"Oliver"}
....
2020-03-10 13:04:01,593 [ 5 ] ERROR GeneXus.Utils.GXUtil - At file: d:\AppPath\customer.cs, line: 692, customer: [ SecurityCheckFailed (403 Forbidden) value for ] {"hshsalt":"hshCustomer","CustomerName":"Harry"}
.NET の場合のヒント: ソース行番号 (CS) を表示するには、デバッグモードでコンパイルし、DLL を実行するインストールディレクトリーに PDB ファイルがある必要があります。どのログレベルでも、役立つかもしれない行番号を表示できます。Java では、DEBUG レベルで十分であり、スタックトレースで確認できます。
解決方法
解決策を見つける前に原因を特定する必要があります。特定にはデバッグ作業が役立ちます。
考えられるシナリオについては、SAC 41179 および次の記事を参照してください: Web 開発のセキュリティに関するヒント。
使用可能バージョン
この機能は複数の GeneXus バージョン (GeneXus X Evolution 3、GeneXus 15、GeneXus 16) で提供されていますが、この記事は GeneXus 16 Upgrade 9 の値、動作、推奨事項の説明になっています。
|