Предоставление пароля для завершенного MySQL

StackOverflow https://stackoverflow.com/questions/619804

  •  03-07-2019
  •  | 
  •  

Вопрос

Приветствую вас.

Я написал небольшой скрипт на python, который вызывает MySQL в подпроцессе.[Да, я знаю, что правильный подход заключается в использовании MySQLdb, но компиляция его под OS X Leopard - это боль, и, вероятно, более болезненная, если бы я хотел использовать скрипт на компьютерах разных архитектур.] Метод подпроцесса работает при условии, что я указываю пароль в команде, которая запускает процесс;однако это означает, что другие пользователи на компьютере могли видеть пароль.

Исходный код, который я написал, можно увидеть здесь.

Приведенный ниже вариант очень похож, хотя я опущу процедуру тестирования, чтобы сделать ее короче:

#!/usr/bin/env python

from subprocess import Popen, PIPE

# Set the command you need to connect to your database
mysql_cmd_line = "/Applications/MAMP/Library/bin/mysql -u root -p"
mysql_password = "root"

def RunSqlCommand(sql_statement, database=None):

    """Pass in the SQL statement that you would like executed.
    Optionally, specify a database to operate on.  Returns the result."""

    command_list = mysql_cmd_line.split()
    if database:
        command_list.append(database)

    # Run mysql in a subprocess
    process = Popen(command_list, stdin=PIPE, stdout=PIPE,
                    stderr=PIPE, close_fds=True)

    #print "Asking for output"
    #needs_pw = process.stdout.readline()
    #print "Got: " + needs_pw

    # pass it in the password
    process.stdin.write(mysql_password + "\n")

    # pass it our commands, and get the results
    #(stdout, stderr) = process.communicate( mysql_password + "\n" + sql_statement)
    (stdout, stderr) = process.communicate( sql_statement )

    return stdout

Я подозреваю, что запрос пароля MySQL на самом деле не находится в stdout (или stderr), хотя я не знаю, как это может быть или означает ли это, что я мог бы перехватить его.

Я действительно попробовал сначала прочитать выходные данные, прежде чем вводить пароль, но это не сработало.Я также попытался передать пароль

Опять же, если я ввожу пароль в командной строке (и, следовательно, у меня нет кода между функциями "Popen" и "communicate"), моя обернутая функция работает.


Две новые мысли, на несколько месяцев дольше:

  1. Используя перспективный позволил бы мне ввести пароль.Он имитирует tty и получает все выходные данные, даже те, которые обходят stdout и stderr.

  2. Существует проект под названием Соединитель MySQL/Python, в ранней альфа-версии, что позволит предоставить чистую библиотеку python для доступа к MySQL, не требуя от вас компиляции какого-либо C-кода.

Это было полезно?

Решение

Вы могли бы просто создать файл my.cnf и указать на него в команде mysql.Очевидно, что вы захотите защитить этот файл с помощью разрешений / acls.Но на самом деле это не должно быть более / менее безопасно, чем иметь пароль в вашем скрипте python или конфигурацию для вашего скрипта python.

Итак, вы бы сделали что-то вроде

mysql_cmd_line = "/Applications/MAMP/Library/bin/mysql --defaults-file=credentials.cnf"

и ваша конфигурация выглядела бы примерно так

[client]
host     = localhost
user     = root
password = password
socket   = /var/run/mysqld/mysqld.sock

Другие советы

Единственный безопасный метод - это использовать файл MySQL cnf, как упоминает один из других плакатов.Вы также можете передать переменную MYSQL_PWD env, но это также небезопасно: http://dev.mysql.com/doc/refman/5.0/en/password-security.html

В качестве альтернативы вы можете взаимодействовать с базой данных, используя файл сокета Unix, и, немного изменив настройки, вы можете управлять разрешениями на уровне идентификатора пользователя.

Еще лучше, вы можете использовать бесплатный BitNami stack DjangoStack, который содержит Python и MySQLdb, предварительно скомпилированные для OS X (а также Windows и Linux). http://bitnami.org/stacks

Это может быть функция Windows / SQL Server, но не могли бы вы использовать надежное соединение (т.Е.используйте свой логин / пароль операционной системы для доступа к базе данных)?Для MySQL может существовать эквивалент OS X.

Или вам может просто понадобиться настроить свою базу данных на использование логина и пароля операционной системы, чтобы вам не нужно было хранить их в своем коде.

В любом случае, просто идея.

Попробуй это:

process.stdin.write(mysql_password + "\n")
process.communicate()
(stdout, stderr) = process.communicate( sql_statement )
process.stdin.close()

return stdout

Вызовите communicate(), чтобы принудительно отправить то, что вы только что записали в буфер.Кроме того, полезно закрыть stdin, когда вы закончите.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top