Нужна помощь в понимании уязвимости SQL-инъекций в спокойном API - PullRequest
1 голос
/ 10 июня 2019

В настоящее время я работаю над успокоительным 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 вырвет все содержимое. Что еще можно сделать с помощью этой настройки?

1 Ответ

0 голосов
/ 10 июня 2019

Ваш вопрос, кажется, больше спрашивает, каков риск SQL-инъекций? Я бы сказал, что самый простой способ понять риск - это посмотреть эти два хорошо сделанных видео от Computerphile ( видео 1 видео 2 ). Есть много способов обезопасить ваши данные перед тем, как использовать базу данных.

...