在这个例子中,是最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();
- }
-
- ?>
(编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|