2012-03-09 100 views
1

更新别人的旧PHP项目,我不熟悉正则表达式。需要知道这个正则表达式是做什么的,它安全吗?

问题一是:这是做什么的?

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

问题二是:这是插入一个安全过滤器进入MySQL数据库没有mysql_real_escape_string()?我知道答案是概率否,但是只有当这个正则表达式不通过时才会使用mysql_real_escape_string()。

谢谢。

+3

此正则表达式匹配一个或多个数字(0-9)可选包含单个'。'在数字的中间或末尾。 – Andrew 2012-03-09 16:54:39

+0

只需使用准备好的语句,那么您将永远不必担心SQL注入。 – CountMurphy 2012-03-09 16:56:47

+0

@CountMurphy这不完全正确。 – 2012-03-09 16:58:40

回答

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 

所以,它确保所述输入是一个数字,如123.652.也将匹配)。它不会匹配.3512a6

数据库插入似乎足够安全,因为它只允许数字。

+0

'\。+'将匹配多个句点,如果匹配尝试找到一个十进制数字,则可能不需要。 – Andrew 2012-03-09 16:58:24

+1

@Andrew:这是一个错字,应该是'\。?'。 – 2012-03-09 16:59:05

0

它试图匹配一个十进制数(尽管很差)。它不会修改$variable,所以你需要在传递给MySQL之前正确地转义它。

+0

为什么'$ variable'必须以数字开头并且必须(但可选)以小数结尾,后面跟随(可选)数字才需要转义?如果它没有通过,那么该领域显然需要逃避,但是你没有在你的答案中提到这一点。 – 2012-03-09 16:59:37

+0

我想解释的是,如果正则表达式不匹配,则使用mysql_real_escape_string()进行转义,否则只是插入。 – 2012-03-09 17:03:27

0

这将匹配小数点前至少有一位的数字(如果有小数点)。如果这个值与这个正则表达式匹配,我不会看到将它插入数据库是不安全的。

0

看起来是否完全匹配。 它匹配 234234232432343.231313132321 和和 322332. 而不是 0.32232 而不是

1

它匹配的字符串:

  1. 开始至少有1位0-9
  2. 在前n位数字0或1后有小数点
  3. 有字符后的任何数字0次或多次
1

它不清理数据库的字符串。

它检查是否$variable匹配这个模式...

  1. 开始与一个或多个数字(^[0-9]+
  2. 其次是可选.[.]?
  3. 其次是尽可能多或尽可能少的数字只要你喜欢([0-9]*
  4. 其次是字符串的结尾($
+0

'[。]'不匹配任何东西,只是一个文字周期。 – Andrew 2012-03-09 16:58:55

+0

是的 - 我只是在你的评论前几​​秒钟就改变了。 – 2012-03-09 16:59:37

0

这是一个安全的过滤器插入mysql数据库没有mysql_real_escape_string()?

假设可能使用这个变量,我会说mysql_real_escape_string()对它来说是无用的。
需要查询组装代码是肯定的。