В настоящее время я работаю над успокоительным API Flask, которое ищет врачей на определенном расстоянии в зависимости от региона. Я хотел бы точно знать, к какому типу SQL-инъекций он уязвим, так как sqllite3 не позволяет использовать несколько команд в одном операторе. С ним связаны несколько разных таблиц, но я включил соответствующие таблицы и то, как выглядит запрос sqllite в коде API. Сам 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-инъекций, и я пробовал несколько примеров, чтобы лучше понять, как это работает. До сих пор, хотя я не получил это, чтобы сделать что-нибудь много. Большинство примеров, которые я нашел в Интернете, включают: выполнить второе утверждение и отбросить таблицу или выплюнуть намного больше информации. Но sqlite3 не позволит вам выполнить 2 оператора одновременно, есть ли способ обойти это и выполнить что-то еще? В качестве альтернативы, какой вред на самом деле может быть нанесен путем изменения одного оператора, который отформатирован следующим образом?
Пока все, что я понял, это что-то вроде
import requests
zip = '27265 or Zip LIKE \'%\''
resp = requests.get('http://127.0.0.1:5002/fullname/' + zip + '&10&first&last')
, что приведет к тому, что таблица Zipcodes вырвет все содержимое. Что еще можно сделать с помощью этой настройки?