在还没有阅读:http://drops.wooyun.org/tips/3939这篇文章的时候,天真的以为不会发生注入的问题。事实狠狠扇了我一巴掌。记住任何时候用户的输入都不要相信。刚好项目中有使用mongodb,那就赶紧亡羊补牢吧。代码是简单了一点。还希望各位大牛多多指点。
/**
* 检查变量类型和是否含有mongo关键字
*
* @param mixed $var 需要检查的变量
* @param mixed $type 变量的类型
* @param bool $multi 是否是多维数组
* @return bool
*/
function checkIsSafeStr ($var, $type = 'string', $multi = FALSE)
{
$type = is_array($type) ? array_map('strtolower', $type) : array(strtolower($type));
//针对mongo注入做关键字检查
$check = function ($string) {
$banStrings = array('{', '}', '$ne', '$gte', '$gt', '$lt', '$lte', '$in', '$nin', '$exists', '$where', 'tojson', '==', 'db.');
foreach ($banStrings as $str) {
if (FALSE !== strpos(strtolower($string), $str)) {
return FALSE;
}
}
return TRUE;
};
if (is_array($var) && in_array('array', $type)) {
foreach ($var as $name => $val) {
if (!$check($name))
return FALSE;
if (FALSE === $multi && is_array($val)) {
return FALSE;
} else if (!self::checkIsSafeStr($val, $type, $multi)) {
return FALSE;
}
}
return TRUE;
} else {
$varType = strtolower(gettype($var));
//先对类型检查
if (!in_array($varType, $type)) {
return FALSE;
}
return $check($var);
}
}
更多关于可以到:
http://drops.wooyun.org/papers/850
http://webcache.googleusercontent.com/search?q=cache:fPNiwObqKcEJ:hi.baidu.com/d4rkwind/item/ad7b81efb799ce2e6dabb8c3+&cd=1&hl=zh-CN&ct=clnk&gl=cn