我遇到了非常奇怪的代码行为。基本上在应该返回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 documentation表示preg_match返回1或0,具体取决于它是否为preg_match成功或失败,如果有错误则返回false。不知道这里发生了什么,如果有人能指出我正确的方向
答案 0 :(得分: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.";
}
输出:
找到了一场比赛。