sql注入浅析
Sql注入是一个老问题了,虽然现在的主流前后端框架都已经处理了此问题,但是弄明白原理有利于我们更好的分析解决问题;
SQL注入:
看下面简单的登录示例bodybody
服务端代码:lt;?phpnamePOST〔username〕;passwordPOST〔password〕;connnewmysqli(localhost,root,root2022);if(connconnecterrno){echomysql连接错误。connconnecterrno;}connquery(setnamesutf8);connselectdb(fdtest1);sqlselectfromfdadminwhereusername。name。andpassword。password。;echosql;rsconnquery(sql);if(!rs){echosql错误。connerror;}else{if(mysqlinumrows(rs)){rowrsfetchassoc();echorow〔username〕。登录成功;}else{echo用户不存在;}}?
数据表结构:
表结构
我们输入admin和123456,是可以登录成功的;生成的sql如下:
selectfromfdadminwhereusernameadminandpassword123456
如果输入adminor11,
生成的sql为:
selectfromfdadminwhereusernameadminor11andpassword12345678
虽然密码不正确,但还是执行成功了,登录成功,这就是简单的sql注入的原理;
当然,这是最简单的情况,我们也是为了演示原理,实际情况肯定不这复杂很多,而且现在后端服务开发,基本都是使用框架,也很少直接拼接sql来执行,框架已经对sql进行了处理,一般不会有sql注入情况,这也是为什么我们推荐使用框架来开发的原因。
但是也有少量特殊情况,需要手动写sql代码,这时就要注意了,下面说下如何避免sql注入:
前端:
前端界面直接给用户使用,永远不要相信用户的输入,所以前端要做好数据验证,前端验证的原则就是,让用户输入的数据类型、格式等尽量符合系统的要求,对不规范的数据进行提示和过滤,前端避免sql注入最基本的方法是过滤,Escape函数:
escape(adminor11);
服务器获取到
admin2720or20271273D271
服务器端获取到需要做处理;
后端:
有些后端开发,认为加了前端验证就不需要后端了,增加代码量还容易出问题,其实
前端验证更多的为了限制普通用户的不规范使用,通过页面能发现的漏洞有限;而且前端验证是可以绕过的,绝大部分攻击者都是通过工具进行的,通过工具直接访问接口、获取数据,这样前端验证就失效了,所以后端面对的是更专业的人士,所以后端的安全防护显得更加重要。
书归正传,后端防护涉及面很广,今天只说下sql注入,mysqli类库执行查询前先绑定
修改后的代码如下:sqlselectfromfdadminwhereusername?andpassword?;stmtconnprepare(sql);stmtbindparam(ss,name,password);rsstmtexecute();if(!rs){echosql错误。connerror;}else{resultstmtgetresult();while(rowresultfetcharray(MYSQLINUM)){echo登录成功;print;}}
除了代码层面,MySQL使用独立用户,并分配最小权限等,也能有效防治sql问题;