Что делает mysql_real_escape_string (), делают это, addslashes () не делает?

Вот мое решение, я использовал Thread и Event:

import subprocess
from threading import Thread, Event

def kill_on_timeout(done, timeout, proc):
    if not done.wait(timeout):
        proc.kill()

def exec_command(command, timeout):

    done = Event()
    proc = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

    watcher = Thread(target=kill_on_timeout, args=(done, timeout, proc))
    watcher.daemon = True
    watcher.start()

    data, stderr = proc.communicate()
    done.set()

    return data, stderr, proc.returncode

В действии:

In [2]: exec_command(['sleep', '10'], 5)
Out[2]: ('', '', -9)

In [3]: exec_command(['sleep', '10'], 11)
Out[3]: ('', '', 0)
20
задан Michael Borgwardt 10 February 2009 в 23:46
поделиться

8 ответов

Addslashes обычно не достаточно хорош при контакте с многобайтовыми закодированными строками.

19
ответ дан 29 November 2019 в 23:04
поделиться

Это добавляет наклонные черты к:

\x00, \n, \r, \, ', " and \x1a. characters.

, Где addslashes только добавляет наклонные черты к

' \ and NUL

, статья Ilias также довольно подробно изложена на ее функциональности

19
ответ дан 29 November 2019 в 23:04
поделиться

gs's резко downvoted ответ на самом деле добр из права.

Стандарт использование SQL, удваивающееся для выхода из литерального апострофа. Нестандартное использование MySQL обратных косых черт для выхода является настройкой по умолчанию, но это может быть отключено и часто, в особенности в sql_mode ANSI.

В этом случае только удвоенный синтаксис будет работать, и любое приложение, у Вас есть использование addslashes (или другой специальный метод выхода) повредится. mysql_real_escape_string будет использовать, какой бы ни выход из метода является лучшим для sql_mode соединения.

многобайтовая проблема кодирования также важна при тихом использовании той противной восточноазиатской кодировки, которая снова использует более низкие 128 символов, но затем действительно Вы хотите использовать UTF-8 вместо этого. \n-выход, с другой стороны, не вызывает беспокойства, так как MySQL может отлично счастливо справиться с необработанной новой строкой в операторе.

5
ответ дан 29 November 2019 в 23:04
поделиться

somedb_real_escape_string() конкретная база данных, addslashes() не.

В случае MySQL это означает:

mysql_real_escape_string () называет библиотечную функцию MySQL mysql_real_escape_string, который предварительно ожидает обратные косые черты к следующим символам: \x00, \n, \r, \, ', "и \x1a.

(Из руководства.)

3
ответ дан 29 November 2019 в 23:04
поделиться

Единственная реальная разница, о которой я знаю, - то, что mysql_real_escape_string () примет набор символов базы данных во внимание при выходе из входной строки. Никакая функция не выйдет из % подстановочных символов и _, который все еще оставляет сценарий открытым для некоторого Внедрения SQL.

1
ответ дан 29 November 2019 в 23:04
поделиться

Согласно руководство PHP:

mysql_real_escape_string () называет библиотечную функцию MySQL mysql_real_escape_string, который предварительно ожидает обратные косые черты к следующим символам: \x00, \n, \r, \, ', "и \x1a.

1
ответ дан 29 November 2019 в 23:04
поделиться

Функция mysql_real_escape_string PHP будет, более или менее, спрашивают mysql, какого символа (символов) нужно оставить , где функция addslashses просто добавит обратную косую черту перед и любую одинарную кавычку ('), двойная кавычка ("), обратная косая черта () или NUL (ПУСТОЙ байт) символ.

два практических эффекта, addslashes имеет тенденцию не работать хорошо с многобайтовыми символами, и, что еще более важно, путем выяснения mysql, каких символов нужно оставить, Вы избегаете возможной будущей совместимости. Используя assslashes отчасти похож на жесткое кодирование несколько определенных символов в escape-последовательность.

1
ответ дан 29 November 2019 в 23:04
поделиться

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

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

Редактирование: я разъяснюсь немного на том, почему я рассматриваю заключение в кавычки плохой идеи: легко забыть, когда и где необходимо заключить в кавычки - должна ли переменная быть строкой или числом, было ли это уже заключено в кавычки и т.д. Параметрический запрос не имеет ни одной из этих проблем , и потребность в заключении в кавычки полностью устранена.

0
ответ дан 29 November 2019 в 23:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: