Python2中input()函数漏洞

函数简介

input()函数是python中的内置函数,函数作用是从stdin中读取数据

input() 与 raw_input() 区别

python2 两个常见输入函数:input 和 raw_input 。

raw_input() 会将输入的内容转换为字符串:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
a1 = raw_input("字符串:")
print type(a1)

a2 = raw_input("数字:")
print type(a2)

a3 = raw_input("变量名:")
print type(a3)

'''
$ python 1.py
字符串:skye
<type 'str'>
数字:2311
<type 'str'>
变量名:a3
<type 'str'>
'''

input() 能自动识别出输入的类型,将输入内容转换为对应类型(str、int、float)。这里我们先尝试输入正常无误的例子,注意字符串的输入方式:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
a1 = input("字符串:")
print type(a1)

a2 = input("数字:")
print type(a2)
'''
$ python 1.py
字符串:"skye"
<type 'str'>
数字:2311
<type 'int'>
'''

input() 产生漏洞原因

函数会将 stdin 输入的内容当做是 python2 代码去执行,看两个例子:

  1. a = raw_input()
    b = input()
    print "raw_input:"+a
    print "input:"+b
    '''
    $ python 1.py
    3+2
    3+2
    raw_input:%d 3+2
    input:%d 5
    '''
    

    input 输入的内容被当做是 python 代码去执行了。

  2. #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    ans = 10
    a = raw_input()
    if a == ans:
    	print "raw_input"
    b = input()
    if b == ans:
    	print "input"
    '''
    $ python 1.py
    ans
    ans
    input
    '''
    

    input 输入 ans 直接读取了 ans 的值到 b 当中,实际效果等同于b = ans。在这里也知道了为什么用 input() 输入字符串时,要加上引号,如果我们不加上,很可能被当做是变量名,结果就如同例子 2 。

利用方式

  • 如果 python 脚本本身就有引入 os 库,输入 payload 直接 getshell:
os.system('/bin/sh')
  • 如果 python 脚本没有引入 os 库,payload 如下:
__import__('os').system('/bin/sh')

修复方法

python2 中避免使用 input() 函数,使用 raw_input() 代替,如果需要 int 可以这样:int(raw_input())

python3 中 input() 输入默认转换为字符型,raw_input() 被去除。

参考文章

<think>嗯,用户想了解Python中的eval()函数的功能和用法。首先,我需要回忆一下eval的基本作用。eval函数是用来执行字符串形式的Python表达式,并返回结果。比如,用户输入一个字符串"3 + 5",eval处理之后会得到8。这一点我记得没错,但得确认一下语法是否正确。 然后,用户可能想知道具体的使用方法。比如,如何正确调用eval函数,有没有参数需要注意。我记得eval可以接受两个可选参数:globals和locals,用来限制执行的命名空间,这很重要,因为安全问题是eval的一个大问题。如果直接执行用户输入的字符串,可能会有恶意代码注入的风险,所以必须提醒用户注意这一点。 接下来,可能需要举几个例子来说明不同的用法。比如基本的算术运算,还有处理变量或者调用函数的情况。例如,eval("x * 2", {"x": 5})应该返回10。但要注意,如果在没有提供globals的情况下,eval会使用当前的全局变量,这可能导致意外行为或者安全漏洞。 还有,用户可能会混淆eval和exec的区别。exec用于执行语句而不是表达式,所以不会返回值,而eval只能处理单个表达式。这点需要解释清楚,避免用户混淆。 另外,应用场景方面,eval常用于动态计算表达式,比如配置文件中读取的数学公式,或者用户输入的简单计算。但必须强调安全措施,比如使用空的globals字典来限制访问。 可能还需要提到一些常见错误,比如如果字符串不是有效的表达式,会抛出SyntaxError。或者尝试访问未授权的变量时出现NameError。这时候需要指导用户如何处理这些异常。 最后,生成相关问题时,要考虑到用户可能想进一步了解如何安全使用eval,或者替代方案,比如ast.literal_eval,或者性能方面的比较。此外,实际应用中的例子也会有帮助,比如在计算器应用中的使用,或者动态配置解析中的案例。 现在需要确保回答结构清晰,分点说明功能、使用方法、注意事项,并给出示例代码。同时要引用提供的参考资料,比如引用[1]和[2]中的内容。还要注意使用正确的LaTeX格式,行内公式用$...$,独立公式用$$...$$,但根据用户提供的示例,似乎没有数学公式,可能不需要,不过如果有变量名或表达式的话,可能需要用。比如,在解释表达式计算时,提到字符串"2 + 3 * 4"会被计算为14,可以用$2 + 3 \times 4$来显示,但用户要求行内数学表达式使用$...$,所以需要检查是否符合格式。 还要确保生成的相关问题合理,比如关于安全性、替代函数、实际应用场景等。需要避免技术错误,比如eval的参数顺序是否正确,globals和locals的作用域规则。同时,回答要符合中文习惯,避免直译英文文档导致的生硬表达。 总之,整理思路后,回答应包括功能概述、基本语法、参数说明、示例代码、注意事项、安全建议和相关问题。每个部分要简明扼要,帮助用户逐步理解eval的用法和潜在风险,并正确引用提供的资料。</think>### Python eval() 函数功能与用法解析 #### 1. 核心功能 `eval()` 是 Python 内置函数,用于**执行字符串形式的有效 Python 表达式**,返回表达式计算结果。其本质是将字符串解析为代码并执行,例如: ```python print(eval("2 ** 3 + (5-1)*2")) # 输出 16 ``` #### 2. 基本语法 ```python eval(expression, globals=None, locals=None) ``` - **expression**:必选参数,需执行的字符串表达式,如 `"sum([1,2,3])"` - **globals**:可选参数,全局变量字典(默认当前作用域) - **locals**:可选参数,局部变量字典(默认当前作用域) #### 3. 典型用法示例 **基础数值计算** ```python expression = "3 * (4 - 1) ** 2" result = eval(expression) # 输出 27 ``` **动态变量操作** ```python x = 10 print(eval("x * 2 + 5")) # 输出 25 ``` **配合字典限制作用域** ```python env = {"a": 5, "b": 3} print(eval("a**2 + b", env)) # 输出 28 ``` #### 4. 安全注意事项(关键) ⚠️ **直接执行用户输入可能导致代码注入攻击** ```python # 危险操作示例 user_input = input("输入表达式: ") print(eval(user_input)) # 若用户输入 "__import__('os').system('rm -rf /')" 将导致灾难 ``` **安全实践** ```python # 限制可用变量与函数 safe_env = {"__builtins__": None} # 禁用内置函数 eval("1 + 1", safe_env) # 安全 eval("open('test.txt')", safe_env) # 触发 NameError ``` #### 5. 与 exec() 的区别 | 函数 | 返回值 | 适用场景 | |--------|------|-------------------| | eval() | 表达式结果 | 计算简单表达式(如数学公式) | | exec() | None | 执行代码块(如循环、函数定义)| #### 6. 应用场景 - 动态计算配置文件中的数学公式 - 实现简易计算器功能 - 解析 JSON 数据中的简单表达式[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值