更新别人的旧PHP项目,我不熟悉正则表达式。需要知道这个正则表达式是做什么的,它安全吗?
问题一是:这是做什么的?
preg_match('/^[0-9]+[.]?[0-9]*$/', $variable)
问题二是:这是插入一个安全过滤器进入MySQL数据库没有mysql_real_escape_string()?我知道答案是概率否,但是只有当这个正则表达式不通过时才会使用mysql_real_escape_string()。
谢谢。
更新别人的旧PHP项目,我不熟悉正则表达式。需要知道这个正则表达式是做什么的,它安全吗?
问题一是:这是做什么的?
preg_match('/^[0-9]+[.]?[0-9]*$/', $variable)
问题二是:这是插入一个安全过滤器进入MySQL数据库没有mysql_real_escape_string()?我知道答案是概率否,但是只有当这个正则表达式不通过时才会使用mysql_real_escape_string()。
谢谢。
^ // 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
。
数据库插入似乎足够安全,因为它只允许数字。
'\。+'将匹配多个句点,如果匹配尝试找到一个十进制数字,则可能不需要。 – Andrew 2012-03-09 16:58:24
@Andrew:这是一个错字,应该是'\。?'。 – 2012-03-09 16:59:05
它试图匹配一个十进制数(尽管很差)。它不会修改$variable
,所以你需要在传递给MySQL之前正确地转义它。
为什么'$ variable'必须以数字开头并且必须(但可选)以小数结尾,后面跟随(可选)数字才需要转义?如果它没有通过,那么该领域显然需要逃避,但是你没有在你的答案中提到这一点。 – 2012-03-09 16:59:37
我想解释的是,如果正则表达式不匹配,则使用mysql_real_escape_string()进行转义,否则只是插入。 – 2012-03-09 17:03:27
这将匹配小数点前至少有一位的数字(如果有小数点)。如果这个值与这个正则表达式匹配,我不会看到将它插入数据库是不安全的。
看起来是否完全匹配。 它匹配 234234232432343.231313132321 和和 322332. 而不是 0.32232 而不是
它匹配的字符串:
它不清理数据库的字符串。
它检查是否$variable
匹配这个模式...
^[0-9]+
).
([.]?
)[0-9]*
)$
)'[。]'不匹配任何东西,只是一个文字周期。 – Andrew 2012-03-09 16:58:55
是的 - 我只是在你的评论前几秒钟就改变了。 – 2012-03-09 16:59:37
这是一个安全的过滤器插入mysql数据库没有mysql_real_escape_string()?
假设可能使用这个变量,我会说mysql_real_escape_string()对它来说是无用的。
需要查询组装代码是肯定的。
此正则表达式匹配一个或多个数字(0-9)可选包含单个'。'在数字的中间或末尾。 – Andrew 2012-03-09 16:54:39
只需使用准备好的语句,那么您将永远不必担心SQL注入。 – CountMurphy 2012-03-09 16:56:47
@CountMurphy这不完全正确。 – 2012-03-09 16:58:40