Лучший способ определить, находится ли последовательность в другой последовательности в Python

ВАЖНО

. Лучший способ предотвратить SQL Injection - использовать подготовленные выражения вместо экранирования , поскольку демонстрирует принятый ответ .

Существуют библиотеки, такие как Aura.Sql и EasyDB , которые позволяют разработчикам легче использовать подготовленные инструкции. Чтобы узнать больше о том, почему подготовленные операторы лучше в останавливать SQL-инъекцию , см. этот mysql_real_escape_string() обход и недавно зафиксированные уязвимости Unicode SQL Injection в WordPress .

Предотвращение впрыска - mysql_real_escape_string ()

У PHP есть специально созданная функция для предотвращения этих атак. Все, что вам нужно сделать, это использовать функцию функции mysql_real_escape_string.

mysql_real_escape_string берет строку, которая будет использоваться в запросе MySQL, и возвращает ту же строку со всеми попытками внедрения SQL безопасно сбежал. В принципе, это заменит эти неприятные кавычки ('), которые пользователь может ввести с помощью заменителя в MySQL, сэкономленная цитата.

ПРИМЕЧАНИЕ: вы должны подключиться к базе данных, чтобы использовать эту функцию!

// Подключение к MySQL

$name_bad = "' OR 1'"; 

$name_bad = mysql_real_escape_string($name_bad);

$query_bad = "SELECT * FROM customers WHERE username = '$name_bad'";
echo "Escaped Bad Injection: 
" . $query_bad . "
"; $name_evil = "'; DELETE FROM customers WHERE 1 or username = '"; $name_evil = mysql_real_escape_string($name_evil); $query_evil = "SELECT * FROM customers WHERE username = '$name_evil'"; echo "Escaped Evil Injection:
" . $query_evil;

Более подробную информацию вы найдете в MySQL - SQL Injection Prevention .

25
задан nbro 8 June 2017 в 22:52
поделиться

6 ответов

Я второй Knuth-Morris-Pratt алгоритм. Между прочим, Вашей проблемой (и решение KMP) является точно рецепт 5.13 в Поваренная книга Python 2-й выпуск. Можно найти связанный код в http://code.activestate.com/recipes/117214/

, Он находит весь корректные подпоследовательности в данной последовательности и должен использоваться в качестве итератора:

>>> for s in KnuthMorrisPratt([4,'a',3,5,6], [5,6]): print s
3
>>> for s in KnuthMorrisPratt([4,'a',3,5,6], [5,7]): print s
(nothing)
21
ответ дан Federico A. Ramponi 28 November 2019 в 21:06
поделиться

То же самое как сопоставление строк сэр... Knuth-Morris-Pratt сопоставление строк

5
ответ дан nlucaroni 28 November 2019 в 21:06
поделиться

Вот метод решения "в лоб" O(n*m) (подобен ответ @mcella ). Это могло бы быть быстрее, чем Knuth-Morris-Pratt реализация алгоритма в чистом Python O(n+m) (см. @Gregg ответ Lind ) для маленький входные последовательности.

#!/usr/bin/env python
def index(subseq, seq):
    """Return an index of `subseq`uence in the `seq`uence.

    Or `-1` if `subseq` is not a subsequence of the `seq`.

    The time complexity of the algorithm is O(n*m), where

        n, m = len(seq), len(subseq)

    >>> index([1,2], range(5))
    1
    >>> index(range(1, 6), range(5))
    -1
    >>> index(range(5), range(5))
    0
    >>> index([1,2], [0, 1, 0, 1, 2])
    3
    """
    i, n, m = -1, len(seq), len(subseq)
    try:
        while True:
            i = seq.index(subseq[0], i + 1, n - m + 1)
            if subseq == seq[i:i + m]:
               return i
    except ValueError:
        return -1

if __name__ == '__main__':
    import doctest; doctest.testmod()

интересно, насколько большой маленькие в этом случае?

10
ответ дан Community 28 November 2019 в 21:06
поделиться
>>> def seq_in_seq(subseq, seq):
...     while subseq[0] in seq:
...         index = seq.index(subseq[0])
...         if subseq == seq[index:index + len(subseq)]:
...             return index
...         else:
...             seq = seq[index + 1:]
...     else:
...         return -1
... 
>>> seq_in_seq([5,6], [4,'a',3,5,6])
3
>>> seq_in_seq([5,7], [4,'a',3,5,6])
-1

Жаль я не эксперт по алгоритму, это - просто самая быстрая вещь, о которой может думать мой ум в данный момент, по крайней мере, я думаю, что это выглядит хорошим (мне), и я весело провел время, кодировав его.;-)

По всей вероятности это - то же самое, которое делает Ваш метод решения "в лоб".

3
ответ дан mcella 28 November 2019 в 21:06
поделиться

Грубая сила может быть хорошо для маленьких шаблонов.

Для больших, посмотрите алгоритм Aho-Corasick .

1
ответ дан Doug Currie 28 November 2019 в 21:06
поделиться

Вот другая реализация KMP:

from itertools import tee

def seq_in_seq(seq1,seq2):
    '''
    Return the index where seq1 appears in seq2, or -1 if 
    seq1 is not in seq2, using the Knuth-Morris-Pratt algorithm

    based heavily on code by Neale Pickett <neale@woozle.org>
    found at:  woozle.org/~neale/src/python/kmp.py

    >>> seq_in_seq(range(3),range(5))
    0
    >>> seq_in_seq(range(3)[-1:],range(5))
    2
    >>>seq_in_seq(range(6),range(5))
    -1
    '''
    def compute_prefix_function(p):
        m = len(p)
        pi = [0] * m
        k = 0
        for q in xrange(1, m):
            while k > 0 and p[k] != p[q]:
                k = pi[k - 1]
            if p[k] == p[q]:
                k = k + 1
            pi[q] = k
        return pi

    t,p = list(tee(seq2)[0]), list(tee(seq1)[0])
    m,n = len(p),len(t)
    pi = compute_prefix_function(p)
    q = 0
    for i in range(n):
        while q > 0 and p[q] != t[i]:
            q = pi[q - 1]
        if p[q] == t[i]:
            q = q + 1
        if q == m:
            return i - m + 1
    return -1
1
ответ дан danodonovan 28 November 2019 в 21:06
поделиться
Другие вопросы по тегам:

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