<? php // 如果环境是php5并且屏蔽了长格式的预定义变量,就进行模仿长格式预定义变量。 if (@ phpversion () >= ' 5.0.0 ' && ( ! @ ini_get ( ' register_long_arrays ' ) || @ ini_get ( ' register_long_arrays ' ) == ' 0 ' || strtolower (@ ini_get ( ' register_long_arrays ' )) == ' off ' )){ $HTTP_POST_VARS = $_POST ; $HTTP_GET_VARS = $_GET ; $HTTP_SERVER_VARS = $_SERVER ; $HTTP_COOKIE_VARS = $_COOKIE ; $HTTP_ENV_VARS = $_ENV ; $HTTP_POST_FILES = $_FILES ; // 判断$_SESSION是否已经注册生效 if ( isset ( $_SESSION )) { $HTTP_SESSION_VARS = $_SESSION ; }} // 防范注入GLOBALS变量 if ( isset ( $HTTP_POST_VARS [ ' GLOBALS ' ]) || isset ( $HTTP_POST_FILES [ ' GLOBALS ' ]) || isset ( $HTTP_GET_VARS [ ' GLOBALS ' ]) || isset ( $HTTP_COOKIE_VARS [ ' GLOBALS ' ])){ die ( " Hacking attempt " );} // 防范$HTTP_SESSION_VARS伪装 if ( isset ( $HTTP_SESSION_VARS ) && ! is_array ( $HTTP_SESSION_VARS )){ die ( " Hacking attempt " );} // 以下代码在环境register_globals = on时模拟off if (@ ini_get ( ' register_globals ' ) == ' 1 ' || strtolower (@ ini_get ( ' register_globals ' )) == ' on ' ){ // 不应该被unset的,并且预定义变量数组中也不包含的变量名,如果外来数据中存在就是访问者注入的! $not_unset = array ( ' HTTP_GET_VARS ' , ' HTTP_POST_VARS ' , ' HTTP_COOKIE_VARS ' , ' HTTP_SERVER_VARS ' , ' HTTP_SESSION_VARS ' , ' HTTP_ENV_VARS ' , ' HTTP_POST_FILES ' ); // 如果HTTP_SESSION_VARS变量未被初始化或不是数组,array_merge函数将失败,所以需要核实HTTP_SESSION_VARS if ( ! isset ( $HTTP_SESSION_VARS ) || ! is_array ( $HTTP_SESSION_VARS )) { $HTTP_SESSION_VARS = array (); } // 合并为一个大数组,数组中包含各种外来变量 $input = array_merge ( $HTTP_GET_VARS , $HTTP_POST_VARS , $HTTP_COOKIE_VARS , $HTTP_SERVER_VARS , $HTTP_SESSION_VARS , $HTTP_ENV_VARS , $HTTP_POST_FILES ); // 防止伪装数组 unset ( $input [ ' input ' ]); unset ( $input [ ' not_unset ' ]); // 所有的名字未列入$not_unset数组的外来变量将被unset,列入的停止执行页面 while ( list ( $var , ) = @ each ( $input )) { // 如果访问者注入了与预定义变量同名的变量 if ( in_array ( $var , $not_unset )) { die ( ' Hacking attempt! ' ); } // echo $var.'<br>'; unset ($ $var ); } unset ( $input );} ?>