关于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);
- 关于sql注入的浅析
- PHP+SQL注入浅析
- SQL注入浅析
- 关于ibatis的SQL注入。
- 关于SQL注入的总结
- 关于sql注入的几个问题
- BS 之 浅析SQL注入
- 浅析php过滤html字符串,防止SQL注入的方法
- [漏洞分析] ProjectSend r561中SQL注入漏洞的浅析
- 浅析php过滤html字符串,防止SQL注入的方法
- 关于一个sql注入注入题目的思考
- 关于Ibatis 的自动防止SQL 注入
- 论坛上看到的,关于sql注入
- 关于Ibatis 的自动防止SQL 注入
- 关于突破SQL注入限制的新思路
- 关于防止SQL注入的问题
- 关于SQL注入点的总结
- 关于怎么预防sql注入的方法
- .net MVC 下载文件乱码问题解决方案
- 解决窗口自适用大小
- DM8148 摄像头采集 显示 识别测试 三
- Servlet学习笔记
- VC6.0 和 VS2010 time_t的区别
- 关于sql注入的浅析
- my strstr 简单实现
- 密码键盘
- CSS选择符权重
- fcntl & FD_CLOEXEC
- samsung4412 TC4 board烧录日志
- 使用hibernate插入时间,没有时分秒
- 解压tar.xz格式 文件
- DM8148 摄像头采集 显示 识别测试 四