pyserial - 运行时发送参数 - input与raw_input - 安全漏洞?

-1 投票
1 回答
1190 浏览
提问于 2025-04-15 19:04

我正在写一个程序,这个程序可以打开串口并把通过串口发送的数据记录到一个文本文件里。现在我正在添加一个功能,让用户可以在程序运行时重新配置串口。我会让用户一次选择一个变量来修改,这样对我来说比较简单(我也希望能有更优雅的解决方案)。

创建串口实例的pyserial函数(serial.Serial())有以下几个参数:

import serial
ser = serial.Serial(port=0, baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=None, xonxoff=0, rtscts=0, writeTimeout=None, dsrdtr=None, interCharTimeout=None) #default values shown

我注意到大部分参数都是整数类型(int()),但有一些不是,比如“timeout”。

我知道使用 int(raw_input("对于整数类型的变量")) 可以安全地给整数变量赋值,但那些默认值为None的变量就需要用 input() 函数来正确赋值可能的None值。

我在其他地方看到过,input()通常不推荐使用,因为它可能会被利用(好像和eval()有关?)。那么我该如何处理这些输入呢?比如使用serial.Serial()时,如果writeTimout = str(None)就会报错。

谢谢!

1 个回答

0

最安全的方法就是把用户输入当作字符串来处理,然后再进行解析。也就是说,让用户输入类似于“键=值”的格式:

baudrate = 9600
parity = N

接着,通过在“=”符号上进行拆分,并去掉两边的空格来解析这些键值对。你可以用一个字符串查找表来给变量赋值(比如,baudrate这个字符串对应baudrate这个变量,依此类推)。这样一来,你就可以根据自己的需求来处理None这个值。

这种方法简单又安全。如果用户输入的内容不是有效的Python代码,input会抛出异常,这样你可能就不想要了。

撰写回答