Python如何在将数据存储到'shelve'模块时处理Web服务安全?
我刚开始学习Python,正在研究shelve模块,用来持久化存储数据,这是为了一个简单的网络服务,能够在互联网上使用。在shelve的文档页面上,我看到以下警告,我想知道如果我打算存储通过网络请求接收到的参数,是否需要做一些额外的检查或清理。
警告:因为shelve模块是基于pickle的,从不可信的来源加载shelf是不安全的。就像pickle一样,加载shelf可能会执行任意代码。
如果我使用下面的代码将数据存储到shelve中,是否需要做额外的验证、清理或检查? 这样传递数据是否有执行代码的风险?
@app.route('/test/login/')
def login():
username = request.args.get('username')
password = request.args.get('password')
print 'username: '+username + ' password: ' + password
shelf = shelve.open('testfile')
shelf['username'] = username
shelf['password'] = password
value1 = shelf['username']
print 'restored: '+ value1
shelf.close()
#etc
return
1 个回答
2
这个警告只有在你尝试把用户提供的数据当作一个“pickle”来处理时才会出现。
把数据存储在shelve里时,你根本不会遇到这个问题;因为username
和password
在存储时,shelve
模块不会把它们当作pickle数据来处理。shelve
模块总是会把存储的数据变成一个pickle记录,当你再次访问这个键时,它会把值加载回来。由于你的用户数据是被包裹在一个pickle里,所以它本身不会被当作pickle来处理。
如果你想让用户提供的数据被当作pickle处理,你需要把这些数据传给pickle.loads()
,或者让shelve
把用户数据当作一个shelve文件来打开。你发的代码并不容易受到这个问题的影响。