Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 登录代码示例,已通过SQL注入攻击,尽管mysql\u real\u escape\u string。。。_Php_Codeigniter_Security_Sql Injection - Fatal编程技术网

Php 登录代码示例,已通过SQL注入攻击,尽管mysql\u real\u escape\u string。。。

Php 登录代码示例,已通过SQL注入攻击,尽管mysql\u real\u escape\u string。。。,php,codeigniter,security,sql-injection,Php,Codeigniter,Security,Sql Injection,我使用CodeIgniter,并且在黑客方面遇到了麻烦。是否可以对下面的登录代码进行SQL注入: function process_login() { $username = mysql_real_escape_string($this->input->post('username')); $password = mysql_real_escape_string(MD5($this->input->post('password')));

我使用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\u real\u escape\u字符串是错误的还是什么?

请看一下旧的SO问题。
我将使用:

$sql = "SELECT * FROM users WHERE username = '?' AND password= '?'";
$dbResult = $this->db->query($sql, array($this->input->post('username')),array($this->input->post('password')));

不,发布的内容可能不会受到sql注入的攻击。虽然getwhere()可能正在执行stripslashes(),但我不确定

如果有SQL注入,它很可能位于应用程序的另一部分。攻击者可以利用此漏洞获取您的极弱的md5()散列,破解它,然后登录。使用sha2系列的任何成员,sha-256都是不错的选择


如果你的网站已经被破坏,那么我严重怀疑这是sql注入。很难自动利用sql注入破坏网站,但这是可能的。我会确保所有库和已安装的应用程序都已完全更新。特别是如果你有一个CMS或论坛。你可以对你的网站进行扫描,看看它是否发现了旧软件 无论如何,请记住mysql\u real\u escape\u string()只包含mysql的元字符:单引号、双引号、分号等。。。仍然完全可以通过修改布尔参数来破解登录函数。不可能说如果你的“GETHOST”函数是脆弱的,但是考虑提交密码是“XYZ或(1=1)”的情况。生成的查询可能会以如下方式结束

 SELECT id FROM users WHERE users=someusername AND password=xyz OR (1=1);

完全有效的查询,并且还完整地通过了mysql\u real\u escape\u字符串,因为它不包含任何关键的元字符。

据我所知,活动记录将正确地为您转义值。因此,使用
$query=$this->db->getwhere()
您不需要使用
mysql\u real\u escape\u string()

但是,您应该始终使用某种控制器验证。特别是,您可以通过正则表达式将用户名和密码限制为某些字符。人们总是建议这样做

此外,如果您经常受到典型的攻击,请考虑使用PHPIDS。这是一个入侵检测系统,可以帮助你防止攻击造成任何损害,因为你可以抛出某种错误或通知

您可能还希望查看有关安全问题的本教程。

如果您的所有函数和访问器都按照它们的名称进行操作,那么该脚本就不会受到SQL注入的攻击

至于你是否正确使用mysql\u real\u escape\u字符串。。。是的,也不是。是的,你的想法是对的,但是你实际上过度使用了它。如果您输入了MD5密码,那么该输入现在是干净的,不能用于注入,因此mysql\u real\u escape\u string调用是多余的。所以这很好:

$username = mysql_real_escape_string($this->input->post('username'));    
$password  = MD5($this->input->post('password'));
如前所述,MD5本身是一个相当弱的哈希算法。查一查,然后用盐腌一个土豆条

为了反驳之前发布的答案,如果用户输入“xyz或(1=1)”作为密码,则出于两个原因,这绝对不会对其脚本造成威胁

1) MD5散列将其转换为无害的散列(例如“d131dd02c5e6eec4693d9a0698aff95c”),使查询符合
SELECT id FROM users='username'和password='D131DD02C5E6EEC4693D9A069AFF95C'的用户

2) mysql\u real\u escape\u string阻止“字符串”注入,即需要单引号或双引号才能跳出预期的SQL查询的注入,但不阻止(例如)数字输入的注入,您需要使用类型转换来阻止

一切都取决于您的“$this->db->getwhere”调用。如果这只是正常地构建查询,而没有做任何奇怪的事情(比如去掉引号,或者将字符串视为整数[无论如何都会抛出错误],等等),那么您在这个脚本中就不会受到攻击。如果你能提供更多关于你经历过的“类型”黑客攻击的详细信息,我们可能会给你一些指导去哪里寻找。你被污损了吗


我没有玩过CodeIgnitor,但我希望它们的内置输入/数据库函数不会做这样奇怪的事情-因此,除非您自己编辑getwhere函数,否则您在这一点上可能不会有问题。

您提供的代码不易被SQL注入攻击,但您不应该在查询中输入密码,甚至没有散列,因为您无法确定查询是否保存到服务器的日志中,并且您通常无法控制谁可以访问该日志。
按用户名查询/加载用户记录,然后将$\u POST中的密码哈希值与该值进行比较。

数据库 根据您的代码判断,我发现您使用的是最新的CI版本(自2012年6月起为2.0.2)

正如在2.0版中所述,
getwhere()
函数(现在称为
getwhere()
)已被放弃
对于everty应用程序,强烈建议您升级当前版本,因为在此期间有很多错误修复,您应该始终使用可用的最安全版本

通常认为它“足够”在查询中提供良好的安全级别,但正如它的前身(mysql_escape_string)所发生的那样,它不能100%安全地抵御所有类型的攻击,因此依赖它并不是最好的做法。虽然安全,但仍有攻击可以通过此筛选器。
有关这方面的更多信息,请在众多信息中进行检查。