关于sql注入的浅析

来源:互联网 发布:好的单片机的价格 编辑:程序博客网 时间:2024/05/11 16:14

写一篇关于sql注入的文章,先介绍下sql注入

          当用户输入的数据中并未对嵌入的SQL声明语句进行正确过滤时,或者用户并没有被严格地限制输入,从而导致恶意代码被执行,就有可能造成SQL注入漏洞。这是一类很普遍的安全漏洞。

解决方法:

1. 先进入linux的日志目录下 ,输入命令

      grep -H -R "table name" /var/log >> /var/reportjerry.log

      通过命令find 等命令查找 带有 ecs_admin_user ,或 limit  等敏感字眼,最后输出内容到某个文件下。

2.查找出 类似
       /user.php?act=is_truruser&username=%ce%27%20and%201=1%20union%20select%201%20and%20%28select%201%20from%28select%20count%28*%29,concat%28%28Select%20concat%280x5b,user_name,0x3a,password,0x5d%29%20FROM%20ecs_admin_user%20limit%200,1%29,floor%28rand%280%29*2%29%29x%20from%20information_schema.tables%20group%20by%20x%29a%29%20%23

不清楚这句话意思的,可以去百度下urlencode 转义出来看看。

3.然后就是去该php里面解决问题了

    方法可以很多种,过滤掉非法字符,如果带的参数是数字类型的话,程序里判断是否为int类型,否则就错误返回;如果带的参数是字符类型的话,可以用正则表达式去除一些非法字符,这样sql语句就不成立了,自然也无法得逞了。

    过滤可以参考如下:

<?php
$title = $_POST['title'];
$description = $_POST['description'];
$dirtystuff = array("\"", "\\", "/", "*", "'", "=", "-
", "#", ";", "<", ">", "+", "%");
$title = str_replace($dirtystuff, "", $title);
$description = str_replace($dirtystuff, "", $description);
?>

另外:如果输入的变量确定是userid之类的int类型,可以强制转化成int类型或判断非int类型报错。

4.因为很多被攻击都是后置性的,所以可以把后台的加密规则改一改

首先如果你是md5加密,可以考虑换成md5(md5(string))这样的双重加密;

当然也可以考虑换成MD5(MD5(string).‘abcd’),通过加入动态不规则代码来进行加密。

当然你也可以自己定义新的加密算法。

简单贴一段echsop后台管理员的加密方式,discuz里也有类似的代码,同理(验证和用户资料或密码修改的地方需要设置和判断)。

   //验证登陆信息 ------------(select用户信息)

    $sql="SELECT `ec_salt` FROM ". $ecs->table('admin_user') ."WHERE user_name = '" . $_POST['username']."'";
    $ec_salt =$db->getOne($sql);
    if(!empty($ec_salt))
    {
         /* 检查密码是否正确 */
         $sql = "SELECT user_id, user_name, password, last_login, action_list, last_login,suppliers_id,ec_salt".
            " FROM " . $ecs->table('admin_user') .
            " WHERE user_name = '" . $_POST['username']. "' AND password = '" . md5(md5($_POST['password']).$ec_salt) . "'";
    }
    else
    {
         /* 检查密码是否正确 */
         $sql = "SELECT user_id, user_name, password, last_login, action_list, last_login,suppliers_id,ec_salt".
            " FROM " . $ecs->table('admin_user') .
            " WHERE user_name = '" . $_POST['username']. "' AND password = '" . md5($_POST['password']) . "'";
    }
    $row = $db->getRow($sql);

    

    //更新管理员的密码 -------------(update用户信息)
      $ec_salt=rand(1,9999);
      $sql = "UPDATE " .$ecs->table('admin_user'). "SET password = '".md5(md5($new_password).$ec_salt)."',`ec_salt`='$ec_salt' ".
               "WHERE user_id = '$adminid'";
      $result = $db->query($sql);




原创粉丝点击