Python 保护用户';s烧瓶应用程序中的凭据,该应用程序不';不要使用数据库,而是使用网页抓取

Python 保护用户';s烧瓶应用程序中的凭据,该应用程序不';不要使用数据库,而是使用网页抓取,python,python-3.x,flask,Python,Python 3.x,Flask,我正在为我所在大学的学生创建一个web应用程序。他们将输入他们的电子邮件和大学证书的密码,我的应用程序将获取他们的密码,为他们登录大学网站,并获取一些数据,这些数据将以更好的方式呈现 以下是我的问题: 使用他们的凭据最安全的方式是什么?确保密码始终是安全的,并对其进行哈希处理,一旦程序可以使用他们的凭据登录,就立即从服务器上删除密码 我应该以什么方式安全地处理他们的凭据?我不是将flask应用程序与数据库一起使用,而是使用他们的凭据登录到其他地方并获取一些数据 下面是我目前如何做的文件。我知道这

我正在为我所在大学的学生创建一个web应用程序。他们将输入他们的电子邮件和大学证书的密码,我的应用程序将获取他们的密码,为他们登录大学网站,并获取一些数据,这些数据将以更好的方式呈现

以下是我的问题:

  • 使用他们的凭据最安全的方式是什么?确保密码始终是安全的,并对其进行哈希处理,一旦程序可以使用他们的凭据登录,就立即从服务器上删除密码
  • 我应该以什么方式安全地处理他们的凭据?我不是将flask应用程序与数据库一起使用,而是使用他们的凭据登录到其他地方并获取一些数据 下面是我目前如何做的文件。我知道这是非常不安全的

    因此,在用户登录到我的应用程序后,routes.py文件显示了我如何接受scraper工具的POST请求,并将其写入一个单独的文件中,该文件包含一个学生用户名和密码的全局变量

    from flask import Flask, render_template
    from flask import request
    from flask import render_template, redirect, url_for, request, jsonify
    import settings
    import json
    
    
    app = Flask(__name__)
    
    @app.route('/')
    def home():
     return render_template('landing.html')
    
    @app.route('/webScraperTool', methods =['POST'])
    def webScraperTool():
     settings.email = request.form['email'];
     settings.password = request.form['password'];
    
     import UniversitySiteScraperTool
     return jsonify(settings.jsonObjects)
    if __name__ == '__main__':
        app.run(debug=True)
    
    设置文件包含凭据的全局变量

    global email
    email = ""
    global password
    password = ""
    
    最后,我的UniversityistesCraperTool将使用全局变量,并使用chrome驱动程序自动登录

    import pandas as pd
    import os
    import re
    import numpy as np
    import datetime
    import sys
    import settings
    import json
    
    from bs4 import BeautifulSoup
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.keys import Keys
    from selenium.webdriver.support import expected_conditions as EC
    
    ################# DRIVER CODE PORTION #################
    # Executable path ->
    
        driver = webdriver.Chrome(executable_path=settings.dirpath + '/chromedriver')
        #Url to DWORKS
    url = "University Website URL"
    driver.get(url)
    
    
    ##username and password##
    usernameStr = settings.email
    passwordStr = settings.password
    
    username = driver.find_element_by_id('username')
    username.send_keys(usernameStr)
    
    password = driver.find_element_by_id('password')
    password.send_keys(passwordStr)
    
    nextButton = driver.find_element_by_css_selector('#welcome > div > div.row.btn-row > input.btn-submit')
    #After I fill in their credentials, click the submit button
    nextButton.click()
    

    由于您只是在抓取一个以明文形式使用用户名和密码的站点,因此对于您来说,在安全地存储用户密码的同时仍然使其可恢复,这样您就可以抓取该站点了

    话虽如此,您并不是像您所说的那样真正地“写入一个单独的文件”,而是用户名和密码只是保存在内存中,即使这些变量包含在不同的文件中

    出于这个原因,我认为让scraper工具成为一个在实例化时接收用户名和密码的类会更简单。然后,当它完成并销毁对象时,用户名和密码也随之销毁

    基本上,该结构看起来与您拥有的结构非常相似,但被包装在一个类中:

    class Scraper(object):
        __init__(self, username, password):
            self.username = username
            self.password = password
            self.driver = webdriver.Chrome(executable_path=settings.dirpath + '/chromedriver')
    
        scrape_site(self):
            url = "University Website URL"
            driver.get(url)
    
            username = driver.find_element_by_id('username')
            username.send_keys(self.username)
    
            password = driver.find_element_by_id('password')
            password.send_keys(self.password)
    
            nextButton = driver.find_element_by_css_selector('#welcome > div > div.row.btn-row > input.btn-submit')
            nextButton.click()
    
    然后,您可以在主应用程序中使用此代码,如下所示:

    from UniversitySiteScraperTool import Scraper
    Scraper(request.form['email'], request.form['password']).scrape_site()