2

ログイン資格情報を確認する Web ページがあります。このページは関数を呼び出し、Or​​acle データベース内のテーブルに接続して、このユーザーがアプリケーションの表示を許可されていることを確認します。これはすべて c# を使用して行われますが、データベースからの致命的なエラーである場合は、javascript を使用してユーザーに通知したいと思います。私のC#コードには、基本的にjavascript関数をWebページに出力する文字列変数があります。このように見えます。

                    string javaScript =
                    "<script>"+
                    "var find = ':';"+
                    "var re = new RegExp(find, 'g');" +
                    "str='@"+CheckAccess[0]._ERROR.ToString().Replace(":"," ")+"';"+
                    "str = str.replace(re, '');"+
                    "if ($('#login_error').css('display') == 'none') {" +

                    "$('#login_error').text(str).show(); }" +
                    "else {Return;}</script>"; 

データベースがエラーを返すと、次のような複数行のエラーが返されます。

  ORA-06550 line 1, column 7
PLS-00306 wrong number or types of arguments in call to 'GETUSERACCESS'
ORA-06550 line 1, column 7
PL/SQL Statement ignored at Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode, OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx* pOpoSqlValCtx, Object src, String procedure, Boolean bCheck)

私がウェブで見たすべての例は、「/」で区切るように言っているので、「未終了の文字列リテラル」エラーが発生し続けません。ただし、これを行う効率的な方法はわかりません。私が達成しようとしていることを達成するためのより良い方法があるでしょうか、またはこの文字列を解析して改行がどこにあるのかを推測する方法をどのように考え出す必要がありますか? どんな助けでも大歓迎です。

ありがとうミゲル

4

2 に答える 2

3

今のやり方でやろうとするのはお勧めしません。そのような C# 文字列で JS コードを書き出すことについて何か臭いがあります。たとえば、エラー メッセージ文字列に期待した内容が含まれていない場合、インジェクション攻撃が発生する可能性があるようです。

エラーが発生したときに JS コードをクライアントに渡そうとする代わりに、エラーを処理する JS コードをページに含めてから、エラー文字列を含む JSON シリアル化されたデータ構造を渡すことができます。これにより、複数行の文字列やその他の特殊文字がサーバーからクライアントに正しく渡されるようになります。

たとえば、クラスが次のような場合:

public class MyClass
{
    public bool Success { get; set; }
    public string ErrorMessage { get; set; }
}

次に、コントローラーメソッドは次のようになります。

public JsonResult TryToValidate(...)
{
    MyClass myClass = // result
    return Json(myClass);
}

ログインページに疑似 JS を使用すると、次のようになります。

MakeAjaxCallToTryToValidate(...)
.whenThatsDone(function ...() {
    if !result.Success
        alert(result.ErrorMessage);
});

または、とにかくエラーの詳細を平均的なユーザーに公開するべきではないため、管理者が見ることができるサーバーにエラーの詳細を記録し、ユーザーに一般的なエラーメッセージを与えることができます. ユーザーが行うと予想される何か無効な場合 (たとえば、間違ったパスワードを入力するなど) は、エラー メッセージでユーザーにその旨とそれを自分で修正する方法を伝える必要がありますが、「引数の数または種類が間違っています」というエラーは表示されません。通常、そのカテゴリにはありません。

于 2013-10-15T20:23:28.813 に答える
2

改行がどこにあるかを「推測」する必要はありません。通常、1 つまたは 2 つの特殊なエスケープ文字で表されます。

  • \r(CR = キャリッジ リターン)、および
  • \n(NL = 新しい行)。

(MS Windows は通常 CRLF を使用し、Unix ベースのシステムは伝統的に LF のみを使用していましたが、これは異なる場合があります)。たとえば、 でそれらを検索しCheckAccess[0]._ERROR.ToString().IndexOf("\r\n")、同じ手法を使用してそれらを置き換えることができます。

エラー テキストを HTML 要素に直接プッシュすることがわかっているので、\r\n(CRLF) を<br/>(HTML 改行) に置き換えることができます。

コード:

CheckAccess[0]._ERROR.ToString().Replace(":"," ").Replace("\r\n", "<br/>")

Oracle は (たとえば) Unix マシンでも実行でき、エラー メッセージで CRLF の代わりに LF のみを返す場合があるため、より安全で一般的なものにする必要がある場合があります。最初に CRLF、次に CR、次に LF を置き換えてみてください。

CheckAccess[0]._ERROR.ToString().Replace(":"," ") .Replace("\r\n", "<br/>") .Replace("\r", "<br/>") .Replace("\n", "<br/>")

次に、JavaScript は CRLF から空白を挿入せず、代わりに html をレンダリングして改行を作成します。

于 2013-10-15T20:30:42.670 に答える