我目前正在开发一个 Flask Restful API,它可以根据区域在一定距离内搜索医生。我想确切地知道它容易受到哪种 SQL 注入(inject)的攻击,因为 sqllite3 不允许在一条语句中使用多个命令。它有几个与之关联的不同表,但我已经在 API 代码中包含了相关的表以及 sqllite 查询的样子。 API 本身相当大,所以请原谅我没有发布整个内容。
from flask import Flask
from flask_restful import Api, Resource, reqparse
import sqlite3
app = Flask(__name__)
api = Api(app)
class fullname(Resource):
def get(self, zipcode,distance,fname,lname):
con = sqlite3.connect('DoctorZipLookup.db')
with con:
cur = con.cursor()
cur.execute("SELECT Latitude, Longitude FROM Zipcodes WHERE Zip = " + zipcode)
#does some math and finds zipcodes less than distance away
cur.execute("SELECT * FROM Doctors WHERE Zip IN(SELECT Zip FROM closezipcodes) AND FirstName LIKE '" + fname + "%' AND LastName LIKE '" + lname + "%' ORDER BY Zip")
cur.execute("SELECT * FROM Comments ORDER BY id")
#put doctors and their comments in a JSON object and return it
api.add_resource(fullname, "/fullname/<string:zipcode>&<string:distance>&<string:fname>&<string:lname>")
app.run(debug=True)
我知道这样编写的查询很容易受到 SQL 注入(inject)的攻击,并且我一直在尝试一些示例,只是为了更好地理解它的工作原理。到目前为止,我还没有让它做很多事情。我在网上找到的大多数示例都包含 ;执行第二条语句并删除表或吐出更多信息。但是 sqlite3 不允许您同时执行 2 个语句,有没有办法解决这个问题并执行其他内容?或者,修改这样格式的单个语句实际上会造成什么危害? 到目前为止,我所想到的就是做类似的事情
import requests
zip = '27265 or Zip LIKE \'%\''
resp = requests.get('http://127.0.0.1:5002/fullname/' + zip + '&10&first&last')
这将导致邮政编码表吐出其所有内容。通过这种设置方式还能做什么?
最佳答案
你的问题似乎更多是在问SQL注入(inject)的风险是什么?我想说,了解风险的最简单方法是观看 Computerphile 制作的两个精彩视频 ( video 1 video 2 )。在使用它访问数据库之前,有很多方法可以清理您的输入。
关于python - 需要帮助了解 Restful API 中的 SQL 注入(inject)漏洞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56530719/