if (preg_match("/ls|bash|tac|nl|more|less|head|wget|tail|vi|cat|od|grep|sed|bzmore|bzless|pcre|paste|diff|file|echo|sh|\'|\"|\`|;|,|\*|\?|\\|\\\\|\n|\t|\r|\xA0|\{|\}|\(|\)|\&[^\d]|@|\||\\$|\[|\]|{|}|\(|\)|-|<|>/i", $cmd)) {
echo("forbid ~");
echo "<br>";
} else {
if ((string)$_POST['a'] !== (string)$_POST['b'] && md5($_POST['a']) === md5($_POST['b'])) {
echo `$cmd`;
} else {
echo ("md5 is funny ~");
}
}
这个正则本意应该是要匹配‘\’的,|\\|\\\\|
但正则式有问题,因为php中正则字符串会被解析两次,正确匹配‘\’,应为‘\\\\’,然而前面有个'\\',
其经过一次解析后把后面的‘|’给转义掉了。导致整体匹配的是‘|\’