2012-03-09 4 views
1

Обновление чужого старого PHP-проекта, и я не знаком с регулярными выражениями.Нужно знать, что делает это регулярное выражение, безопасно ли это?

Вопрос один: что это делает?

preg_match('/^[0-9]+[.]?[0-9]*$/', $variable) 

Вопрос два: является ли это безопасный фильтр для вставки в БД MySQL без mysql_real_escape_string()? Я знаю, что ответ прост нет, но он настроен на использование mysql_real_escape_string() только в том случае, если это регулярное выражение не проходит.

Спасибо.

+3

Это регулярное выражение соответствует одной или нескольким цифрам (0-9), которые могут содержать одиночный '.' в середине или в конце цифр. – Andrew

+0

Просто используйте подготовленные инструкции, тогда вам никогда не придется беспокоиться об инъекциях SQL. – CountMurphy

+0

@CountMurphy это не совсем так. –

ответ

5
^  // start of string 
[0-9]+ // one or more numbers (could also be \d+) 
[.]? // zero or one period (could also be \.?) 
[0-9]* // zero or more numbers (could also be \d*) 
$  //end of string 

Таким образом, это гарантирует, что ввод номера, например, как 12 или 3.6 (52. также будет соответствовать). Он не будет соответствовать .35 или 12a6.

Кажется достаточно безопасным для вставки БД, поскольку он позволяет только номера.

+0

'\. +' Будет соответствовать нескольким периодам, что, вероятно, не желательно, если совпадение пытается найти десятичное число. – Andrew

+1

@Andrew: Это была опечатка, это должно было быть '\.?'. –

0

Он пытается сопоставить десятичное число (хотя и плохо). В любом случае он не изменяет $variable, поэтому вам нужно будет сбежать от него должным образом, прежде чем перейти к MySQL.

+0

Почему «$ variable» нужно экранировать, когда нужно начинать с номера, и должен (но необязательно) заканчиваться десятичной точкой, а затем (необязательными) номерами? Если это не пройдет, то, очевидно, нужно будет избежать поля, но вы не упомянули об этом в своем ответе. –

+0

То, что я пытался объяснить, было то, что если регулярное выражение не соответствует, оно экранируется с помощью mysql_real_escape_string(), иначе оно просто вставлено. –

0

Это будет соответствовать числу, имеющему хотя бы одну цифру перед десятичной точкой (если есть десятичная точка). Если значение соответствует этому регулярному выражению, я не вижу, как его можно было бы небезопасно вставлять в базу данных.

0

выглядит, если точное совпадение. он соответствует 234234232432343.231313132321 и и 322332. и не .32232 и не

1

это соответствует строкам, которые:

  1. начала, по крайней мере, 1 цифра от 0-9
  2. имеют десятичную точку после первых n цифр 0 или 1 раз
  3. имеют цифру после символа 0 или более раз
1

Он не дезинфицирует строку для базы данных.

Проверяется $variable матчи этой модели ...

  1. начинается с одной или более цифр (^[0-9]+)
  2. с последующим дополнительным . ([.]?)
  3. следуют как много или как мало цифр как вам нравится ([0-9]*)
  4. , за которым следует конец строки ($)
+0

'[.]' Ничего не соответствует, только буквальный период. – Andrew

+0

Да, я просто изменил это за несколько секунд до вашего комментария. –

0

Это безопасный фильтр для вставки в базу данных mysql без mysql_real_escape_string()?

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