我使用CodeIgniter,并且遇到黑客问题.是否可以对下面的登录代码进行SQL注入:
function process_login() { $username = mysql_real_escape_string($this->input->post('username')); $password = mysql_real_escape_string(MD5($this->input->post('password'))); //Check user table $query = $this->db->getwhere('users', array('username'=>$username, 'password'=>$password)); if ($query->num_rows() > 0) { // success login data
我用 mysql_real_escape_string
错了,还是什么?
没有发布的内容可能不容易受到sql注入攻击.虽然getwhere()可以做一个striplashes(),但我不确定.
如果有SQL注入它可能是在你的应用程序的另一部分.攻击者可以利用此漏洞获取极其弱的 md5()哈希,破解它,然后登录.使用sha2系列的任何成员,sha-256是一个很好的选择.
如果您的网站已被污损,那么我严重怀疑它是sql注入.很难自动利用sql注入来破坏网站,但这是可能的.我会确保所有库和已安装的应用程序都已完全更新.特别是如果您有CMS或论坛.您可以对您的站点运行OpenVAS扫描,以查看是否找到任何旧软件.
根据您的代码判断,我发现您没有使用最新的CI版本(截至06/12的2.0.2).
如更改日志中所述,getwhere()
函数(现在称为get_where()
)已经放弃了2.0版本.
至于everty应用程序,你强烈建议你升级你当前的版本,因为在此期间有很多错误修正,你应该总是依赖最安全的版本.
mysql_real_escape_string通常被认为是"足够"以在查询中提供良好的安全级别,但是当它发生在它的前身(mysql_escape_string)时,它不是100%安全地抵御所有类型的攻击,因此依赖于它不是最好的练习.虽然安全,但仍有攻击可以通过此过滤器.
有关此问题的详细信息,请在SO中检查此问题.
在codeignier中: 如果您正在开发自定义应用程序,我建议您至少使用mysqli扩展,或者更好的是,使用PDO类; 准备好的陈述无疑是最安全的,应该比其他一切更受青睐.
但我们处于框架环境中,Codeigniter提供了3种安全查询数据库的好方法,将正确的工具应用于正确的输入而无需担心.我正在谈论查询绑定和手动转义与$ this-> db-> escape()系列和活动记录类
您可以在我刚刚链接的网址上找到使用示例,或者在这里阅读其他同行的答案,所以我不会在这篇文章中详细介绍每个程序.
关于你的密码,正如其他用户已经说过的那样,md5()
是一个现在有缺陷的哈希算法.有一些彩虹表可以在相对较短的时间内破解你的md5密码,所以你最好使用更高的安全级别哈希算法,比如sha1()或sha256,sha512和其他
在codeigniter中:
Codeigniter附带了一个安全助手类,它为您提供了一个方便的功能do_hash()
(可能dohash()
在您的旧安装中),可以给出散列算法.作为参数(目前我认为它只支持md5和sha1)并且默认为sha1().
我不清楚你为什么要责备你的SQL注入登录.这些是您整个申请中仅有的两种表格吗?
您没有提供信息来判断您是否使用$ _GET参数或者您遵循原生URI分段,但我相信您这样做是因为我认为从这个角度来看您是安全的.
您应该确保您的网站中没有其他输入表单包含进入数据库的输入,否则您可以保证您的登录数量,但有人可以穿透后门并从那里读取您的数据库表并获取日志以"合法"的方式进入您的网站.
此外,还可能存在其他入侵来源,例如受损的cookie.作为一条建议,无论何时你选择使用一个框架(并且你自己比从头开始自己做更大的帮助),你应该倾向于使用它的大部分功能,特别是当涉及到安全性时.这是一个巨大且非常微妙的问题,因此您必须将此主题放在首位,而且一个完善的框架,拥有庞大的社区和频繁的更新是您最接近安全的问题.
因此,你劝来更新您的CI安装(导游可以发现这里的手册中,选择您的版本并按照指令),总是用你给每个任务的顶部工具和不认为限制您的门将使您免受窗户的入侵.务必彻底检查并调查所有可能的原因.
后期补遗:不要忘记XSS,CSRF,会话录制和其他热安全问题.