| 在这个例子中,是最low安全等级的php代码编写样例,可以看到,代码中并没有对用户输入的id变量进行检查和过滤,同时使用的是$_REQUEST全局数组的方式,如果不是特别需要,我们编程的时候尽量不要使用$_REQUEST获取用户的参数,因为$_REQUEST的参数比较杂,包括$_GET,$_POST,$_COOKIE等超全局变量,并且二者还存在变量获取顺序的不一致,受配置文件中variables_order的约定,在存在waf的环境下,容易造成绕过。未经处理的用户输入直接与sql语句拼接交互,造成sql注入漏洞,十分危险。 (2) Medium level <?php  if( isset( $_POST[ 'Submit' ] ) ) { // Get input $id = $_POST[ 'id' ]; $id = mysql_real_escape_string( $id );  // Check database  $query  = "SELECT first_name, last_name FROM users WHERE user_id = $id;";  $result = mysql_query( $query ) or die( '<pre>' . mysql_error() . '</pre>' );   // Get results  $num = mysql_numrows( $result );  $i   = 0;  while( $i < $num ) {      // Display values      $first = mysql_result( $result, $i, "first_name" );      $last  = mysql_result( $result, $i, "last_name" );       // Feedback for end user      echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";       // Increase loop count      $i++;  }   //mysql_close();  }  ?> 
 这个版本的代码,与之前的相比只是多了个mysql_real_escape_string函数的过滤,但是要知道这里的$id在sql语句中是数字类型,这样mysql_real_escape_string的转义就会形同虚设,注入仍旧是一马平川。当然不恰当的字符编码,可能会造成宽字节注入。 (3) High leval <?php   if( isset( $_SESSION [ 'id' ] ) ) {      // Get input      $id = $_SESSION[ 'id' ];       // Check database      $query  = "SELECT first_name, last_name FROM users WHERE user_id = '$id' LIMIT 1;";      $result = mysql_query( $query ) or die( '<pre>Something went wrong.</pre>' );       // Get results      $num = mysql_numrows( $result );      $i   = 0;      while( $i < $num ) {          // Get values          $first = mysql_result( $result, $i, "first_name" );          $last  = mysql_result( $result, $i, "last_name" );           // Feedback for end user          echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>";           // Increase loop count          $i++;      }       mysql_close();  }   ?> 
 (编辑:宣城站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |