SQL注入与防御

什么是SQL注入 程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。 攻击者可以提交一段精心构造的数据库查询代码,根据返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。 受影响的系统:对输入的参数不进行检查和过滤的系统。 简单的SQL注入实例 假设这么一个情景,一个网页的后台入口处需要验证用户名和密码,验证程序的SQL语句是这样写: Select* fromadminwhereuser=‘TxtBox1.txt’andpass=‘TxtBox2.txt’ 如果用户填写的用户名和密码都是: ‘abc’ or ‘1’=‘1’ 那么将导致SQL语句是: Select* fromadminwhereuser=‘abc’ or ‘1’=‘1’andpass==‘abc’ or ‘1’=‘1’ 这条语句是永真式,那么攻击者就成功登陆了后台。这就是最简单的SQL注入方式。 SQL注入过程 (1).寻找可能存在SQL注入漏洞的链接 (2).测试该网站是否有SQL注入漏洞 (3).猜管理员帐号表 (4).猜测管理员表中的字段 (5).猜测用户名和密码的长度 (6).猜测用户名 (7).猜测密码 SQL注入的防范 由于SQL注入攻击是从正常的WWW端口访问,而且表面看起来跟一般的Web页面访问没什么区别,所以许多防火墙等都不会对SQL注入发出警报。而目前互联网上存在SQL注入漏洞的Web站点并不在少数,对此,网站管理员和Web应用开发程序员必须引起足够的重视。 SQL注入漏洞在网上极为普遍,通常是由于程序员对用户提交的数据和输入参数没有进行严格的过滤所导致的。 比如过滤逗号,单引号,分号等;如果select、delete、from、*、union之类的字符串同时出现多个的话,也要引起重视;最好对用户提交的参数的长度也进行判断。 防范SQL注入的另一个可行办法是摒弃动态SQL语句,而改用用户存储过程来访问和操作数据。这需要在建立数据库后,仔细考虑Web程序需要对数据库进行的各种操作,并为之建立存储过程,然后让Web程序调用存储过程来完成数据库操作。这样,用户提交的数据将不是用来生成动态SQL语句,而是确确实实地作为参数传递给存储过程,从而有效阻断了SQL注入的途径 PHP与SQL注入防御小例 下面的代码:PHP代码 if ($admin) { echo '登陆成功!'; include('admin.php'); } else { echo '你不是管理员,无法进行管理!'; } 我们的这个页是http://daybook.diandian.com/login.php,那么我们提交:http://daybook.diandian.com/login.php?admin=1,直接就是管理员了,直接进行管理。 如何避免上面的问题呢?首先,从php.ini入手,把php.ini里面的register_global =off,就是不是所有的注册变量为全局,那么就能避免了。但是,我们不是服务器管理员,只能从代码上改进了,那么我们如何改进上面的代码呢?我们改写如下: PHP代码 $admin = 0; // 初始化变量 if ($_POST['admin_user'] && $_POST['admin_pass']) { // 判断提交的管理员用户名和密码是不是对的相应的处理代码 // ... $admin = 1; } else { $admin = 0; } if ($admin) { echo '登陆成功!'; include('admin.php'); } else { echo '你不是管理员,无法进行管理!'; } 那么这时候你再提交`http://daybook.diandian.com/login.php?admin=1`就不好使了。 这是实验室一个师姐之前做项目的一个小例子。当然还有对sql语句有四大句:select 、update、delete、insert,进行的防御。采用正则判断如果是这四大sql语句就提示用户非法操作,否则进行过滤处理请求。 关于sql注入还有很多防御方法,希望感兴趣的同学,一起讨论!
本博客所有文章如无特别注明均为原创。作者:老薛pvp复制或转载请以超链接形式注明转自 老薛博客 - 专业分享技术文章
原文地址《SQL注入与防御

相关推荐

发表评论

路人甲 表情
看不清楚?点图切换 Ctrl+Enter快速提交

网友评论(0)