SQL 注入漏洞原理以及修复方法_sql注入漏洞(2)

insert
delete from
drop table
update
truncate
from
%

常见的几种web语言修复方案如下:

1、 如果网站使用的语言为asp或者aspx,则可参考以下修复方法:

ASP一般编程上可参考以下代码编程思路,过滤GET/POST请求模块代码。

dim SQL_injdata
SQL_injdata = "'|and|exec|insert|select|delete|update|count|*|%
|chr|mid|master|truncate|char|declare"
SQL_inj = split(SQL_Injdata,"|")
If Request.QueryString<>"" Then
For Each SQL_Get In Request.QueryString
For SQL_Data=0 To Ubound(SQL_inj)
if instr ( Request.QueryString
(SQL_Get),SQL_Inj(SQL_DATA))>0
Then
Response.Write "参数中包含非法字符"
Response.end
end if
next
Next

2.对于PHP语言编写的网站,大都是和mysql数据库结合的,可通过如下几种方法结合起来防范SQL注入的漏洞:

(1)修改php中默认配置文件php.ini中的配置,来降低sql注入的风险.

参考路径:/usr/local/apache2/conf/php.ini,不同中间件可能位置不一样。
修改如下几项:

safe_mode = on //开启安全模式
magic_quotes_gpc = On //开启过滤函数
display_errors = Off //禁止错误信息提示
注:把magic_quotes_gpc选项打开,在这种情况下所有的客户端GET和POST的数据都会自动进行addslashes处理,所以此时对字符串值的SQL注入是不可行的,但要防止对数字值的SQL注入,如用intval()等函数进行处理。但如果你编写的是通用软件,则需要读取服务器的magic_quotes_gpc后进行相应处理。

(2)在GET提交的数据中进行过滤select 、update、delete、insert等其他语句。使用正则就构建如下函数:

<?php
function inject_check($sql_str)
{
return eregi('select|insert|update|delete|'|
function verify_id($id=null)
{
if (!$id) { exit('没有提交参数!'); } // 是否为空判断
elseif (inject_check($id)) { exit('提交的参数非法!'); } // 注
射判断
elseif (!is_numeric($id)) { exit('提交的参数非法!'); } // 数
字判断
$id = intval($id); // 整型化
return $id;
}
?>
然后进行对某个参数的过滤:
<?php
if (inject_check($_GET['id']))
{
exit('你提交的数据非法,请检查后重新提交!');
}
else
{
$id = verify_id($_GET['id']); // 这里引用了我们的过滤函数,
对$id进行过滤
echo '提交的数据合法,请继续!';
}
?>

(3)在POST提交的数据中,使用函数addslashes()是最终的比较好的方法,构建如下函数:

<?php
function str_check( $str )
{
if (!get_magic_quotes_gpc()) // 判断magic_quotes_gpc是否打开
{
$str = addslashes($str); // 进行过滤
}
$str = str_replace("_", "\_", $str); // 把 '_'过滤掉
$str = str_replace("%", "\%", $str); // 把' % '过滤掉
return $str;
}
?>
对于大批量的数据,修改为如下:
<?php
function post_check($post)
{
if (!get_magic_quotes_gpc()) // 判断magic_quotes_gpc是否为打
开
{
$post = addslashes($post); // 进行magic_quotes_gpc没有打开的
情况对提交数据的过滤
}
$post = str_replace("_", "\_", $post); // 把 '_'过滤掉
$post = str_replace("%", "\%", $post); // 把' % '过滤掉
$post = nl2br($post); // 回车转换
$post= htmlspecialchars($post); // html标记转换
return $post;
}
?>

(4)对于MySQL用户,可以使用函数mysql_real_escape_string( ):

<?php
$clean = array();
$mysql = array();
$clean['last_name'] = "O'Reilly";
$mysql['last_name'] =
mysql_real_escape_string($clean['last_name']);
$sql = "INSERT
INTO user (last_name)
VALUES ('{$mysql['last_name']}')";
?>

(5)使用支持参数化查询语句和占位符的数据库操作类(如PEAR::DB, PDO等),如使用PEAR::DB的例子:

<?php
$sql = 'INSERT
INTO user (last_name)
VALUES (?)';
$dbh->query($sql, array($clean['last_name']));
?>

以上方法结合使用,则可有效的防止在PHP语言网站的SQL注入。

3、 对于jsp语言类型的网站,建议采用如下方法进行修复:

(1)通过参数化查询方式进行SQL注入攻击防护,参考代码:

using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
SqlCommand comm = new SqlCommand();
comm.Connection = conn;
//为每一条数据添加一个参数
comm.CommandText = "select COUNT(*) from Users where
Password = @Password and UserName = @UserName";
comm.Parameters.AddRange(
new SqlParameter[]{
new SqlParameter("@Password", SqlDbType.VarChar)
{ Value = password},
new SqlParameter("@UserName", SqlDbType.VarChar)
{ Value = userName},});
comm.ExecuteNonQuery();
}
//以‚?‛等位符进行参数化查询
PreparedStatement pstmt = con.prepareStatement("select * from
table where name = ?");
pstmt.setString(1, para);
ResultSet rs = pstmt.executeQuery();

(2)使用MyBatis技术,通过Mapper.xml文件定义SQL语句进行SQL注入攻击防护,参考代码:

<mapper namespace="TestUser">//命名空间
<select id="getById" parameterType="java.lang.String"
resultMap="TestFlowResult">
select
<include refid="TestFlowColumns" />
<![CDATA[
from TEST_TABLE
where
INSPECT_ID = #{id}
]]>
</select>
</mapper>

注:在编写mybatis的映射语句时,尽量采用‚#{xxx}‛这样的格式。若不得不使用‚${xxx}‛这样的参数,要手工地做好过滤工作,来防止sql注入攻击。

(3)使用特殊字符过滤程序防护SQL注入攻击,参考代码:

public static bool SqlCheck(string OldString)
{
bool Checkvalue = false;
string NewString = OldString.ToLower();
string Replace =
"'|and|exec|insert|select|delete|update|count|*|;
|%|union|chr|mid|master|truncate|char|declare|asc|cast|
set|fetch|varchar|sysobjects|drop|alert|script|<|>";
string[] arrReplace = Replace.Split('|');
for (int i = 0; i < arrReplace.Length; i++)
{
if (NewString.IndexOf(arrReplace[i].ToString()) >= 0)
{
bolvalue = true;
break;
}
}
return Checkvalue;
}

4、 除此之外,还可以进行对数据库方面进行加固,来防止sql注入的产生:

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数网络安全工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。

img

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点!真正的体系化!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

g-K2mgOPp5-1715541947469)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上网络安全知识点!真正的体系化!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 30
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值