首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在ASP/VBScript中,如果没有用户定义的数据被传递出去,eval和execute仍然危险吗?

在ASP/VBScript中,如果没有用户定义的数据被传递出去,eval和execute仍然危险吗?
EN

Stack Overflow用户
提问于 2015-09-25 21:46:09
回答 2查看 1.2K关注 0票数 2

与其说这是一个技术问题,不如说这是一个“伦理”问题。

很明显,如果允许用户定义的数据/变量通过这些数据/变量,那么Eval()Execute()是危险的。然而,我一直有这样一种感觉:不管发生什么,这些函数的使用都是不受欢迎的,只能作为最后的手段使用。

不管怎么说,我到处都用过它们,因为它可以使编码更高效、更动态.但我总是确保我知道通过函数传递的内容是受控的,而不是用户定义的。你认为这个编码不好吗?黑客是否可以利用这些函数,即使它没有读取由RequestSession变量或任何其他用户定义的数据定义的任何内容?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-29 07:03:59

如果您传递给Eval()或Execute()的纯粹是您自己的字符串,而没有任何用户可以影响的输入,那么它应该是安全的。然而,这也使Eval()和Execute()的许多可能性变得毫无用处。

例如,使用Eval()和Execute()来创建类似API的函数是非常诱人的,其中用户在查询字符串中调用函数,而不是对每个可能的调用使用大的select...case。

我还看到它在CSV解析中使用,其中列名被映射到记录集-这些列同样非常有用,但非常危险,但是您已经在您的问题中说明了这一点--您知道这一点。

如果您完全确定所解析的代码在您的完全控制之下,那么它是非常强大的。

票数 1
EN

Stack Overflow用户

发布于 2015-09-28 10:33:15

如果有什么帮助的话,我会用这个函数在一定程度上代替Eval。它允许您指定在Eval中哪些函数是有效的。要使用它,只需调用Calculate(表达式)

代码语言:javascript
复制
'Calculation limitations for use with Calculate function...
Const C_VALID_CALC_CHARS        = "0123456789.+-*/()^\=,"
'NOTE: Deliberately broken this const so that it is readable in StackOverflow...
Const C_VALID_CALC_FUNCTIONS    = " Abs Asc Atn CBool CByte CCur CDate 
    CDbl Chr CInt CLng Cos CSng CStr Date DateAdd DateDiff DatePart 
    DateSerial DateValue Day Escape Exp FormatCurrency FormatDateTime 
    FormatNumber FormatPercent GetLocale Hex Hour InStr InStrRev Int Fix 
    IsDate IsEmpty IsNull IsNumeric LCase Left Len Log LTrim RTrim Trim 
    Maths Mid Minute Month MonthName Now Oct Replace Right Rnd Round Second 
    Sgn Sin Space Split Sqr StrComp String StrReverse Tan Time Timer 
    TimeSerial TimeValue UCase Unescape Weekday WeekdayName Year "


'Calculate
'   Calculates the expression string and returns a value.
'Usage:
'   value = Calculate("Sin(43) * Cos(75)")
'Parameters:
'   expression (string) - A string value containing the expression to be evaluated.
'Notes:
'   This function provides a controlled method for evaluating specific 
'   functions but has been severly limited to minimise negative effects 
'   from hacking attempts. A complete list of available functions and 
'   symbols can be found in the two variables C_VALID_CALC_CHARS and 
'   C_VALID_CALC_FUNCTIONS.
Function Calculate(expression)
    Dim rV
    rV = ""
    If expression & "" <> "" Then
        Dim t, c, v
        'Validate first...
        t = expression
        'Strip out all standard characters...
        For c = 1 to Len(C_VALID_CALC_CHARS)
            t = Replace(t, Mid(C_VALID_CALC_CHARS, c, 1), " ")
        Next 'c
        'Strip out multiple spaces...
        Do While Instr(t, "  ") > 0
            t = Replace(t, "  ", " ")
        Loop
        t = Trim(t)
        'Check what we're left with...
        v = t = ""
        If Not v Then
            Dim f
            f = Split(t, " ")
            v = True
            For c = 0 To UBound(f, 1)
                v = Instr(C_VALID_CALC_FUNCTIONS, f(c)) > 0
            Next 'f
        End If
        'Define the return value...
        If v Then
            rV = Eval(expression)
        Else
            rV = "Invalid Expression!"
        End If
    End If
    Calculate = rV
End Function

这可能不是最快的方法,特别是如果您经常使用它,但您可以使用它作为一种方式,以验证一个方程,然后才开始进入它。

我刚才确实测试过了,但是如果你有什么问题请告诉我。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32791099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档