标签: SQL

  • SQL SERVER 2008 数据修复

    一台EPO服务器数据库出现一致性错误。
    尝试修复,使用语句,记录一下。

    alter database EPODB set emergency
    alter database EPODB set single_user
    dbcccheckdb(‘EPODB ‘,REPAIR_ALLOW_DATA_LOSS)
    alter database EPODB set multi_user
    alter database EPODB set online

  • MySQL中SQL的单字节注入与宽字节注入

    一、单字节SQL注入

    MYSQL的SQL注入已经由来已久,以下是普遍采用的注入步骤:

    1、在GET参数上加一个/*或者#(mysql专有的注释),判断数据库是否是mysql,比如:
    http://www.xxx.com.cn/article.php?id=1607 and 1=1/*

    2、猜解某表的字段数,从order by 1一直更改到页面出错为止,就可以得到该表的字段数

    注入URL:http://www.xxx.com.cn/article.php?id=1607 or 1=1 order by 10#

    对应的SQL: select * from articles where id=1607 or 1=1 order by 10#….
    3、使用该表和用户表进行关联查询,在文章列表里就可以看到用户名和密码了。当也要猜解用户表的表名和用户名、密码的字段名,比如上一步得到的字段数是5:

    注入的URL:http://www.xxx.com.cn/article.php?id=1607 or 1=1 union select  username,password,1,2,3 from user

    对应的SQL: select * from articles where id=1607 or 1=1  union select  username,password,1,2,3 from user
    这样就可以在界面上看到用户名和密码了。

    解决方法:

    过滤数据:这并不是罗唆。在合适的地方使用良好的数据过滤,可以减小多数安全隐患,甚至可以消除其中的一部分。

    将数据用括号包含:如果你的数据库允许(MySQL 允许),在 SQL 语句中,不论什么类型的数据都用单引号包含起来。

    转义数据:一些合法的数据可能在无意中破坏 SQL 语句本身的格式。使用 mysql_escape_string() 或者所使用数据库提供的转移函数。如果没有提供这样的函数,addslashes() 也是不错的最后选择。

    二、宽字节注入

    宽字节注入也是在最近的项目中发现的问题,大家都知道%df’ 被PHP转义(开启GPC、用addslashes函数,或者icov等),单引号被加上反斜杠\,变成了 %df\’,其中\的十六进制是 %5C ,那么现在 %df\’ = %df%5c%27,如果程序的默认字符集是GBK等宽字节字符集,则MYSQL用GBK的编码时,会认为 %df%5c 是一个宽字符,也就是縗’,也就是说:%df\’ = %df%5c%27=縗’,有了单引号就好注入了。比如:

    以下为引用的内容:

    $conn = mysql_connect(”localhost”,”root”,”2sdfxedd”);
    mysql_query(”SET NAMES ‘GBK’”);
    mysql_select_db(”test”,$conn);
    $user = mysql_escape_string($_GET[‘user’]);
    $pass = mysql_escape_string($_GET[‘pass’]);
    $sql = “select * from cms_user where username = ‘$user’ and password=’$pass’”;
    $result = mysql_query($sql,$conn);
    while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
    $rows[] = $row;
    }
    ?>
     

     

    则通过以下注入即可:

    http://www.xxx.com/login.php?user=%df’%20or%201=1%20limit%201,1%23&pass=

    对应的SQL是:

    select * from cms_user where username = ‘運’ or 1=1 limit 1,1#’ and password=”

    解决方法:就是在初始化连接和字符集之后,使用SET character_set_client=binary来设定客户端的字符集是二进制的。如:

    以下为引用的内容:

    mysql_query(”SET character_set_client=binary”);

  • 常用的几种数据库比较

       ACCESS :我刚开始写网页不外乎是ASP +ACCESS 那个时候已经觉得很厉害了,网络时代变了,现在面临淘汰了,不过这个口号已经打了好几年了还在打不知道什么时候是真正的过时。

      SQL SERVER : 上学时候学过的数据库语言,好像都会教这个课程,使用其实是差不多的都是SQL语言,就是负载能力要强,不过我使用的很少,更愿意在ACCESS和MYSQL之间进行选择。

      MYSQL :我现在经常用的数据库,说不上为什么,没有任何人教过我,都是自学还是这么的乐此不疲,其实刚开始使用只是因为它是开源的,后来知道了,他的商业使用是需要购买许可的,就是我们可以用它来开发程序,但是卖出的程序使用MYSQL是需要花钱购买的。