浅谈php web安全(3)

发表于:2013-12-31来源:IT博客大学习作者:Benwin点击数: 标签:php
$sql = update phpben set `user_name` =benwin,level=5-- , level=1; (6)恶意更新和删除 //正常语句 $sql = update phpben set `user_name` = benwin where id =1; //注入后,恶意代码是1 or id0

  $sql = "update phpben set `user_name` ='benwin',level=5-- ', level=1";

  (6)恶意更新和删除

  //正常语句

  $sql = "update phpben set `user_name` = ‘benwin' where id =1";

  //注入后,恶意代码是“1 or id>0”

  $sql = "update phpben set `user_name` = ‘benwin' where id =1 or id>0";

  //正常语句

  $sql = "update phpben set `user_name` =’benwin’ where id=1";

  //注入后

  $sql = "update phpben set `user_name` ='benwin' where id>0#' where id=1";

  $sql = "update phpben set `user_name` ='benwin' where id>0-- ' where id=1";

  (7)union、join等

  //正常语句

  $sql ="select * from phpben1 where `user_name`=’benwin’ ";

  //注入后

  $sql ="select * from phpben1 where`user_name`=’benwin’ uninon select * from phpben2#’ ";

  $sql ="select * from phpben1 where`user_name`=’benwin’ left join……#’ ";

  (8)通配符号%、_

  //正常语句

  $sql ="select * from phpben where `user_name`=’benwin’ ";

  //注入通配符号%匹配多个字符,而一个_匹配一个字符,如__则匹配两个字符

  $sql ="select * from phpben where `user_name` like ’%b’ ";

  $sql ="select * from phpben where `user_name` like ’_b_’ ";

  这样只要有一个用户名字是b开头的都能正常运行,“ _b_”是匹配三个字符,且这三个字符中间一个字符时b。这也是为什么有关addslashes()函数介绍时提示注意没有转义%和_(其实这个是很多 phper不知问什么要过滤%和_下划线,只是一味的跟着网上代码走)

  (9)还有很多猜测表信息的注入sql

  //正常语句

  $sql ="select * from phpben1 where`user_name`='benwin'";

  //猜表名,运行正常则说明存在phpben2表

  $sql ="select * from phpben1 where`user_name`='benwin' and (select count(*) from phpben2 )>0#' ";

  //猜表字段,运行正常则说明phpben2表中有字段colum1

  $sql ="select * from phpben1 where`user_name`='benwin' and (select count(colum1) from phpben2 )>0#'";

  //猜字段值

  $sql ="select * from phpben1 where`user_name`='benwin' and left(pwd,1)='p'#’'";

  当然还有很多,笔者也没研究到专业人士那种水平,这里提出这些都是比较常见的,也是phper应该知道并掌握的,而不是一味的在网上复制粘贴一些防注入代码,知然而不解其然。

  下面一些防注入方法回看可能更容易理解。

  3.3防注入的一些方法

  3.3.1 php可用于防注入的一些函数和注意事项。

  (1)addslashes 和stripslashes。

  Addslashes 给这些 “’”、“””、“\”,“NULL” 添加斜杆“\’”、“\””、“\\”,“\NULL”, stripslashes则相反,这里要注意的是php.ini是否开启了magic_quotes_gpc=ON,开启若使用addslashes会出现重复。所以使用的时候要先get_magic_quotes_gpc()检查

  一般代码类似:

  if(!get_magic_quotes_gpc())

  {

  $abc = addslashes($abc);

  }

  其实这个稍微学习php一下的人都知道了,只不过笔者想系统点介绍(前面都说不是专家级文章),所以也顺便写上了。addslashes

  (2)mysql_escape_string()和mysql_ real _escape_string()

  mysql_real_escape_string 必须在(PHP 4 >= 4.3.0, PHP 5)的情况下才能使用。否则只能用 mysql_escape_string

  if (PHP_VERSION >= '4.3')

  {

  $string = mysql_real_escape_string($string);

  }else

  {

  $string = mysql_escape_string($string );

  }

  mysql_escape_string()和mysql_ real _escape_string()却别在于后者会判断当前数据库连接字符集,换句话说在没有连接数据库的前提下会出现类似错误:

  Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied for user 'ODBC'@'localhost' (using password: NO) in E:\webphp\test.php on line 11

  (3)字符代替函数和匹配函数

  str_replace() 、perg_replace()这些函数之所以也在这里提是因为这些函数可以用于过滤或替代一些敏感、致命的字符。

  3.3.2防注入字符优先级。

  防注入则要先知道有哪些注入字符或关键字,常见的mysql注入字符有字符界定符号如“'”、“"”;逻辑关键字如“and”、“or”;mysql注悉字符如“#”,“-- ”,“/**/”;mysql通配符“%”,“_”;mysql关键字 “select|insert|update|delete|*|union|join|into|load_file|outfile”

  (1)对于一些有规定格式的参数来说,防注入优先级最高的是空格” ”。

原文转自:http://blogread.cn/it/article/6086