上一篇文章我们讲到了基本的sql注入攻击的概念问题,想必有很多人会基本了解到了我们的用户是如何做到sql注入攻击的,以及我们表单设计将会变得很复杂吗?这一篇我们将会真正了解我们前端设计人员的艰辛,仅仅是一个表格的提交,但是我们设计人员却是要付出很多辛苦的,而此篇所讲仅仅只是sql注入攻击,对于很多漏洞以及本身系统的bug所带来的危害,我们能做多少呢?这个下次再聊吧!!
上一节我们知道了基本概念,和一种最为简单的解决办法就是防止用户使用一些非法字符,但是仅仅如此就可以了吗?下面我们最为深层次了解一些更为重要的sql注入攻击,希望对大家有所帮助!!
如果我们的用户是一名高级程序员,他会深知一些别人不知道信息,比如GET,SESSION这些php自带的大数组,他们会给我们的程序员带来很多方便的操作,但是一旦这些数据落入到我们的用户手中,结果会变成什么呢?
防止用户操纵 GET 变量
我们看下面一段简单代码:
<?php
$pid = $_GET[’pid’];
//we create an object of a fictional class Page
$obj = new Page;
$content = $obj->fetchPage($pid);
//and now we have a bunch of PHP that displays the page
?>
这段代码是从用户的url下捕获到用户想要进入的pid新网页,并且进行动态生成新的网页。嘻嘻 我们的用户会非常乖地看着他们url这么正常地跳转吗?我不知道,你也不知道,如果当时的url是这样的www.XXXX.com/template.php?pid=33 这个时候网速不太好了,网页就是刷不出来,我们的用户看到后面写了33,一时间兴趣来了,将pid=33,改成了pid=331怎么办,有些人当然明白这样会跳到指定网页或者网页不存在提示错误,而这一切的前提都是在我们的用户还不知道我们的后台文件存储是如何做的情况下,或者说我们的用户还是不够聪明不能造成语意上的攻击,可是如果一个高手来了,输入别的东西,比如输入 SQL 命令或某个文件的名称(比如 /etc/passwd),或者搞别的恶作剧,比如输入长达 3,000 个字符的数值,那么会发生什么呢?
在这种情况下,要记住基本规则,不要信任用户输入。应用程序开发人员知道 template.php 接受的个人标识符(PID)应该是数字,所以可以使用 PHP 的 is_numeric() 函数确保不接受非数字的 PID
接下来我们接着再看一段代码,这段代码所蕴含的sql的注入攻击可能比较高明,一看至少是一些程序员在做的事情。
防止表单远程提交
<?php
if ($_POST[’submit’] == “go”){
//strip_tags
$name = strip_tags($_POST[’name’]);
$name = substr($name,0,40);
//clean out any potential hexadecimal characters
$name = cleanHex($name);
//continue processing….
}
function cleanHex($input){
$clean = preg_replace(”![\][xX]([A-Fa-f0-9]{1,3})!”, “”,$input);
return $clean;
}
?>
<form action=”<?php echo $_SERVER[’PHP_SELF’];?>” method=”post”>
<p><label for=”name”>Name</label>
<input type=”text” name=”name” id=”name” size=”20″ maxlength=”40″/></p>
<input type=”hidden” name=”table” value=”users”/>
<input type=”hidden” name=”action” value=”create”/>
<input type=”hidden” name=”status” value=”live\”/>
<p><input type=”submit” name=”submit” value=”go”/></p>
</form>
注意,隐藏变量之一暴露了表名:users。还会看到一个值为 create 的 action 字段。只要有基本的 SQL 经验,就能够看出这些命令可能控制着中间件中的一个 SQL 引擎。想搞大破坏的人只需改变表名或提供另一个选项,比如 delete。
现在还剩下什么问题呢?远程表单提交。
Web 的好处是可以分享信息和服务。坏处也是可以分享信息和服务,因为有些人做事毫无顾忌。
以 表单为例。任何人都能够访问一个 Web 站点,并使用浏览器上的 File > Save As 建立表单的本地副本。然后,他可以修改 action 参数来指向一个完全限定的 URL(不指向 formHandler.php,而是指向 http://www.yoursite.com/formHandler.php,因为表单在这个站点上),做他希望的任何修改,点击 Submit,服务器会把这个表单数据作为合法通信流接收。
首先可能考虑检查 $_SERVER[’HTTP_REFERER’],从而判断请求是否来自自己的服务器,这种方法可以挡住大多数恶意用户,但是挡不住最高明的黑客。这些人足够聪明,能够篡改头部中的引用者信息,使表单的远程副本看起来像是从您的服务器提交的。
处理远程表单提交更好的方式是,根据一个惟一的字符串或时间戳生成一个令牌,并将这个令牌放在会话变量和表单中。提交表单之后,检查两个令牌是否匹配。如果不匹配,就知道有人试图从表单的远程副本发送数据。
要创建随机的令牌,可以使用 PHP 内置的 md5()、uniqid() 和 rand() 函数,具体的使用还希望大家可以多参考一下php文档和相关资料,希望我们可以共同进步