手把手叫你SQL注入攻防(PHP语法)

31 篇文章 0 订阅
13 篇文章 0 订阅

闲话不说,直接来!

理论补充:1.http://blog.csdn.net/wusuopubupt/article/details/8752348

                         2.http://www.cnblogs.com/hkncd/archive/2012/03/31/2426274.html


1.什么是SQL注入,猛戳wikipedia查看

2.本地测试代码:

如果表单提交正确,就打印hello,“username”

否则,打印“404 not found!”

<?php 
	require 'config.php';
	$DBConnection = mysql_connect ( "$dbhost", "$dbuser", "$dbpwd" );
	mysql_select_db ( "$dbdatabase" );
	
    if(isset($_GET['submit']) && $_GET['submit']){    
	$sql="select * from test where name='".$_GET['username']."'and password='".$_GET['password']."'";
	//echo $sql;exit;
	$result=mysql_query($sql,$DBConnection);	
	$num=mysql_num_rows($result);		
	if($num>=1)
	{
		echo "hello,".$_GET['username'];
	}
	else {
		echo"404 not found";
	}
}
?>
<form action="login.php" method="GET">
<table>
	<tr>
		<td>username</td>
		<td><input type="textbox" name="username"/></td>
		<td>password</td>
		<td><input type="textbox" name="password"></td>
		<td>submit</td>
		<td><input type="submit" name="submit"></td>
	</tr>
</table>
</form>


3.浏览器界面显示:


4.重头戏,sql注入:




5.原理--为什么用户名不正确,却可以显示hello?

我可以echo一下:

$sql="select * from test where name='".$_GET['username']."'and password='".$_GET['password']."'";
echo $sql;exit;

显示:



拿到我的mysql数据库中查询:



可以看到,居然能查到信息,因为sql语句中,前一半单引号被闭合,后一半单引号被 “--”给注释掉,中间多了一个永远成立的条件“1=1”,这就造成任何字符都能成功登录的结果。

6.小结:

1)其实这个sql注入过程上很简单,困难的地方在于提交SQL注入语句的灵活性上面,单引号的使用很关键,另外,多用echo打印调试也很值得一试~~

2)GET方式提交表单很危险,所以还是用POST方式吧!

    参考:http://blog.csdn.net/gideal_wang/article/details/4316691

3)防止SQL注入:可以看出,sql注入就是用户提交一些非法的字符(如本文的单引号’和sql语句的注释号--,还有反斜杠\等),所以要用转义:  htmlspecialchars函数,mysql_read_escape_string函数都可以实现。

4)JS段验证表单了,JSP/PHP等后台还要验证码?

     ---需要,因为friebug可以禁用JS...

--------------------------------------------------------------------------

update:

上面的方法,当password通过md5加密的话,就无法实现注入了,那么就在username上做手脚:


username后面的内容就都被注释掉了。哈哈~

参考:http://newaurora.pixnet.net/blog/post/166231341-sql-injection-%E7%AF%84%E4%BE%8B(%E7%99%BB%E5%85%A5%E7%AF%84%E4%BE%8B)


by wusuopuBUPT



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值