0

我遇到了非常奇怪的代码行为。本质上,在应该返回 true 的 preg_match 上,下一条语句不会自行执行。让我用我自己的代码演示一下:

foreach($params as $param)
{
  error_log("processing $param");
  $doesInputContainBadCode = preg_match("/<script\b[^>]*>([\s\S]*?)<\/script>/m",$param);
  error_log("input contains bad code? :".$doesInputcontainBadCode);
  if($doesInputContainBadCode === 1) 
    error_log("process this input");
}

假设我的 $params 数组包含:

$params = {"first_name","last_name","middle_name","<script type="text/javascript">alert("javascript massacre");</script>", "whatever", "something else"}

这是 error_log 显示的内容:

processing first_name
input contains bad code? : 0
processing last_name
input contains bad code? : 0
processing middle_name
input contains bad code? : 0
processing <script type="text/javascript">alert("javascript massacre");</script>
processing whatever

请注意在处理包含参数的“javascript”后如何跳过 error_log。它应该有记录的 输入包含错误的代码?: 1 处理这个输入

但是,这些都没有记录。至少,我认为它必须记录:

输入包含错误代码?:

无论 preg_match 结果如何。但它显然没有,而且不仅针对此输入,而且 preg_match 成功的任何输入都会重复此行为。

PHP 文档指出 preg_match 返回 1 或 0 取决于 preg_match 是成功还是失败,如果有错误则返回 false。不知道这里发生了什么,如果有人能指出我正确的方向

4

1 回答 1

1

您应该只测试 ===错误

更改日志 php 5.3.6 如果偏移量高于主题长度,则返回 FALSE。
以上是一个错误。

警告

此函数可能返回布尔值 FALSE,但也可能返回计算结果为 FALSE 的非布尔值。请阅读有关布尔值的部分以获取更多信息。使用 === 运算符测试此函数的返回值。

正如您在日志中看到的那样,它永远不会运行低谷

if($doesInputContainBadCode === 1) 
   error_log("process this input");
}

例如,您必须进行测试。

$param ="<script type=\"text/javascript\">alert(\"javascript massacre\");</script>";
if (preg_match("/<script/i", $param)) {
    echo "A match was found.";
} else {
    echo "A match was not found.";
}

输出:

找到匹配项。

于 2013-04-23T17:06:58.770 回答