SQL注入是我们数据库常见的一种安全漏洞,这种漏洞一般都是通过在前台表单页面输入有危害关键字的信息,系统在接收前台传输的信息在后台拼接SQL查询语句时利用拼接后的SQL语句漏洞达到入侵的目的。这里我们举一个比较常见的例子来简要说明一下sql注入的原理。
假如我们有一个users表,里面有两个字段username和password。在我们的java代码中我们初学者都习惯用sql拼接的方式进行用户验证。比如:"select id from users where username = '"+username +"' and password = '" + password +"'" 这里的username和password都是我们存取从web表单获得的数据。下面我们来看一下一种简单的注入,如果我们在表单中username的输入框中输入' or 1=1-- ,password的表单中随便输入一些东西,假如这里输入123.此时我们所要执行的sql语句就变成了select id from users where username = '' or 1=1-- and password = '123',我们来看一下这个sql,因为1=1是true,后面 and password = '123'被注释掉了。所以这里完全跳过了sql验证。这里只是简单的举一个例子。
那如何解决这种SQL注入漏洞呢?最简单的就是对敏感关键字进行过滤,如下是一段过滤敏感关键字的js代码,大家可以在自己的项目中加入如下一段关键字过滤功能,就可以达到最基本的防范注入漏洞功能了。
js防注入漏洞过滤代码如下:
<!-- 堆代码 duidaima.com --> function filterValue($data, $filterKeyword=false){ if(is_numeric($data)){ return $data; }else{ $data = addslashes($data); if(get_magic_quotes_gpc()){ $data = trimslashes($data); } $data = str_replace('_', '\_', $data); $data = str_replace('%', '\%', $data); $data = str_replace('*', '\*', $data); $data = nl2br($data); $data = trim($data); if($filterKeyword){//进行严格的敏感词替换 $data = str_ireplace('select', 'select', $data); $data = str_ireplace('join', 'join', $data); $data = str_ireplace('union', 'union', $data); $data = str_ireplace('where', 'where', $data); $data = str_ireplace('insert', 'insert', $data); $data = str_ireplace('delete', 'delete', $data); $data = str_ireplace('update', 'update', $data); $data = str_ireplace('like', 'like', $data); $data = str_ireplace('drop', 'drop', $data); $data = str_ireplace('create', 'create', $data); $data = str_ireplace('modify', 'modify', $data); $data = str_ireplace('rename', 'rename', $data); $data = str_ireplace('alter', 'alter', $data); $data = str_ireplace('cast', 'cas', $data); $data = str_ireplace('outfile', 'outfile', $data); $data = str_ireplace('load_file', 'load_file', $data); } return $data; } }总结:
SQL注入漏洞是一种古老而又简单的安全漏洞,而我们解决起来也必将简单,直接把一些SQL关键字过滤掉就可以了。