这更像是一种道德规范"问题而非技术问题。
如果允许用户定义的数据/变量通过它们,print series.head()
print type(series)
print series.index
year
1992 36.222222
1993 53.200000
1994 49.400000
1995 34.571429
1996 39.200000
Name: ranking, dtype: float64
<class 'pandas.core.series.Series'>
Int64Index([1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014], dtype='int64', name=u'year')
和Eval()
是危险的,这是非常明显的。然而,我总是觉得这些功能的使用无论如何都是不受欢迎的,只能作为最后的手段使用。
无论如何,我已经在这里和那里使用它们,它可以使编码更有效率和动态...但我总是确保我知道通过函数传递的内容是受控制的而不是用户定义的。你会考虑这个糟糕的编码吗?黑客是否有办法利用这些功能,即使它没有读取Execute()
或Request
变量或任何其他用户定义数据定义的任何内容?
答案 0 :(得分:1)
如果有任何帮助,我会使用此功能将Eval替换到一定程度。它允许您指定哪些函数在Eval中有效。要使用它,只需拨打Calculate(
表达式 )
。
'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 :(得分:1)
如果您传入Eval()或Execute()的内容纯粹是您自己的字符串,没有任何输入,用户可以影响,那么它应该是安全的。 但是,这也使得Eval()和Execute()的许多可能性变得无用。
例如,使用Eval()和Execute()创建类似API的函数非常诱人,其中用户在查询字符串中调用函数,并且您可以简单地使用Eval()而不是使用大选择。每个可能的电话.case 我也看到它在CSV解析中使用,其中列名使用eval()映射到记录集列,同样非常有用,但非常危险,但是你已经在你的问题中证明了你知道这一点。
如果您完全确定已解析的代码完全由您完全控制,那就非常强大。