我有一个检查登录凭据的网页。该页面调用一个函数,该函数然后连接到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)
我在网上看到的所有例子都说用&#34; /&#34;所以我不会继续得到&#34;未终止的字符串文字&#34;错误。但是,我没有看到有效的方法来做到这一点。有没有更好的方法来实现我想要实现的目标,或者我必须找到一种方法来解析这个字符串并猜测换行符的位置。非常感激任何的帮助。
由于 米格尔
答案 0 :(得分:3)
我不建议你按照现在的方式去做。有些东西闻到了用这样的C#字符串写出的JS代码,例如:如果错误消息字符串不包含您期望的内容,则看起来可能发生注入攻击。
不是在发生错误时尝试将JS代码传递给客户端,而是可以包含JS代码来处理页面中的错误,然后只传递包含错误字符串的JSON序列化数据结构。这应该允许多行字符串和其他特殊字符正确地从服务器传递到客户端。
E.g。如果你的班级是这样的:
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);
});
或者,既然您不应该向普通用户公开错误详细信息,您只需在管理员可以看到它的服务器上记录错误的详细信息,并向用户提供一般错误消息。如果你可能期望用户做的事情是无效的(例如输入错误的密码),那么错误消息应该告诉他们,以及如何自己解决它,但是“错误数量或类型的参数”错误不是通常属于那个类别。
答案 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机器上运行(例如)并且可能在错误消息中只返回LF而不是CRLF,你可能想要更安全并且是通用的,首先尝试替换CRLF,然后CR,然后LF:
CheckAccess[0]._ERROR.ToString().Replace(":"," ")
.Replace("\r\n", "<br/>")
.Replace("\r", "<br/>")
.Replace("\n", "<br/>")
然后你的javascript不会从CRLF中注入空格,而是渲染html来创建换行符。