php表单提交中sql提防注入攻击一

        当你看到这篇文章的时候,想必你一定在忙着如何想好你的UI界面,忙着如何才能成为一名优秀的UI设计师,其实我的想法显然与你不谋而合,我最近一直也在头痛这些,以前一直以为做前端是一件很简单的事情,现在想来是只能说是慢工出细活啊,让我们一起加油吧,亲们!!
        今天我们讨论的话题是如何做一个好的表单提交,正与好多网友的博客一样,“千万不要相信你的用户,尽管他是你的上帝”,用户在提交表格的时候,会在表格中填写各种不同的信息,以至于做出很多意想不到的问题,如果你的用户同时又是一个脚本高手,那么对于一个网站不严谨的表格,他想破坏你的网站,数据库简直是易如反掌的事情,今天我们就简单讲讲在表格中填写sql语句对于你的网站的影响,用行话来说这被叫作sql注入攻击!!
       下面我们来看看两端代码,看看他们的安全性如何?
清单 1. 安全无暇的代码
<?php
$myUsername = ‘tmyer’;
$arrayUsers = array(’tmyer’, ‘tom’, ‘tommy’);
define(”GREETING”, ‘hello there’ . $myUsername);
?>
      上面的代码是安全的,因为所有的数据输入都是内部完成的(除非你自己想搞破坏,那这个就有点不安全了哦)
      但是,下面的数据元素都是有瑕疵的。
清单 2. 不安全、有瑕疵的代码
<?php
$myUsername = $_POST[’username’]; //不安全的
$arrayUsers = array($myUsername, ‘tom’, ‘tommy’); //不安全的
define(”GREETING”, ‘hello there’ . $myUsername); //不安全的
?>
      上面的代码是不太安全的,我们伟大用户可能不会填写自己的username,甚至会写上一句sql执行代码,这一定被执行,你想想结果吧,取得数据库的信息倒是其次,如果整个数据库因为一句代码而被毁了,怎么办,看来对于sql注入攻击,前端还是有必要进行过滤的。
     现在我们想想我们可能会怎么做呢?才可以避免这些安全性攻击?
     我们可能会这样想:对用户输入进行清理的一个简单方法是,使用正则表达式来处理它。在这个示例中,只希望接受字母。将字符串限制为特定数量的字符,或者要求所有字母都是小写的,这可能也是个好主意。
     嘻嘻 说了这么多也许很多人还不知道什么是sql注入攻击吧,那我就列举一个实例代码,来看看sql注入攻击时如何进入你的数据库,而你居然还在代码中苦苦地判断用户名和密码是否匹配呢?
    假设有两份文件,前端的工作时做到一份表单来获取用户信息的,如下
<html>
<head>
<title>Login</title>
</head>
<body>
<form action=”verify.php” method=”post”>
<p><label for=’user’>Username</label>
<input type=’text’ name=’user’ id=’user’/>
</p>
<p><label for=’pw’>Password</label>
<input type=’password’ name=’pw’ id=’pw’/>
</p>
<p><input type=’submit’ value=’login’/></p>
</form>
</body>
</html>
这段代码很简单,就是输入用户名和密码来并使用post方法交予verify.php来处理,其中verify.php的代码如下
<?php
$okay = 0;
$username = $_POST[’user’];
$pw = $_POST[’pw’];
$sql = “select count(*) as ctr from users where username=’”.$username.”‘ and password=’”. $pw.”‘ limit 1″;
$result = mysql_query($sql);
while ($data = mysql_fetch_object($result)){
if ($data->ctr == 1){
//they’re okay to enter the application!
$okay = 1;
}
}
if ($okay){
$_SESSION[’loginokay’] = true;
header(”index.php”);
}else{
header(”login.php”);
}
?>
        可能很多人会觉得没有问题啊,就是查找用户名和密码是否匹配嘛,写的不错哦,可是如果我们的用户不给出正确的用户名或者密码,怎么办,有人会答道,那是不行,那么会找不到这个人 count就是0,那么这个用户就是不存在的,没啥啊,好吧,那么小生就这样填写我的信息,看看数据库查询时会怎么做,我的用户名是:foo,密码是: ‘ or ‘1′=’1 ,于是我们sql语句在查询时就变成了下面一句话:
$sql = “select count(*) as ctr from users where username=’foo’ and password=” or ‘1′=’1′ limit 1″;
        用户返回的count(*)的之前的前提是用户名和密码都要是同时对的才可以,现在变成了又多了一个条件1=1?只要两个条件有一条符合,就可以返回1,嘻嘻,显然后者是必然正确的,于是,作为foo的我就成了你们的会员,可以享有一切了,怎么办?这就是sql注入攻击!!很危险,作为前端的你,写好每一个判断时候都要想想你的用户会按照你的想法去填写吗?答案是绝大数人不会的!!!
         解 决这个问题的办法是,将 PHP 的内置 mysql_real_escape_string() 函数用作任何用户输入的包装器。这个函数对字符串中的字符进行转义,使字符串不可能传递撇号等特殊字符并让 MySQL 根据特殊字符进行操作。下面展示了带转义处理的代码。
<?php
$okay = 0;
$username = $_POST[’user’];
$pw = $_POST[’pw’];
$sql = “select count(*) as ctr from users where username=’”.mysql_real_escape_string($username).”‘ and password=’”. mysql_real_escape_string($pw).”‘ limit 1″;
$result = mysql_query($sql);
while ($data = mysql_fetch_object($result)){
if ($data->ctr == 1){
//they’re okay to enter the application!
$okay = 1;
}
}
if ($okay){
$_SESSION[’loginokay’] = true;
header(”index.php”);
}else{
header(”login.php”);
}
?>

防止表单sql注入攻击是一个复杂的概念,此篇只在讲述基本概念,下几篇将会继续讲解多种解决办法,还请大家共同学习!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值