2

我有一个检查登录凭据的网页。该页面调用一个函数,该函数然后连接到 oracle 数据库中的表并检查该用户是否被允许查看应用程序。这一切都是使用 c# 完成的,但是如果它们是来自数据库的致命错误,我想使用 javascript 通知用户。在我的 c# 代码中,我有一个字符串变量,它基本上会将 javascript 函数打印到网页中。它看起来像这样。

                    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

我不建议尝试按照您现在的方式进行操作。将 JS 代码写成这样的 C# 字符串会有些味道,例如,如果错误消息字符串不包含您期望的内容,那么看起来可能会发生注入攻击。

当错误发生时,您可以在页面中包含用于处理错误的 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

您不必“猜测”换行符的位置。通常由一两个特殊转义字符表示:

  • \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 机器上运行(例如)并且可能在错误消息中只返回 LF 而不是 CRLF,因此您可能希望更加安全和通用,首先尝试替换 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 回答