PHP防止暴力破解存储设备

2012 年 11 月 30 日6880
> 网站安全 > 正文
PHP防止暴力破解存储设备
2012-09-19 10:38:48

我要投稿

暴力攻击是一种不使用任何特殊手段而去穷尽各种可能性的攻击方式。它的更正式的叫法是穷举攻击——穷举各种可能性的攻击。

对于访问控制,典型的暴力攻击表现为攻击者通过大量的尝试去试图登录系统。在多数情况下,用户名是已知的,而只需要猜测存储设备

尽管暴力攻击没有技巧性可言,但词典攻击似乎有一定的技巧性。最大的区别是在进行猜测时的智能化。词典攻击只会最可能的情况列表中进行穷举,而不像暴力攻击一样去穷举所有的可能情况。

防止进行验证尝试或限制允许错误的次数还算是一个比较有效的安全手段,但是这样做的两难之处在于如何在不影响合法用户使用的情况下识别与阻止攻击者。

在这种情况下,对一致性的判定可以帮助你区分二者。这个方法与前面所述的防止会话劫持的做法很相似,但区别是你要确定的是一个攻击者而不是一个合法用户。

考虑下面的HTML表单:

<form action="http://http://www.zjjv.com// /login.php" method="POST">

<p>Username: <input type="text" name="username" /></p>

<p>Password: <input type="password" name="password" /></p>

<p><input type="submit" /></p>

</form>

攻击者会察看这个表单并建立一段脚本来POST合法的数据给http://http://www.zjjv.com///login.php

<?php

$username = 'victim';

$password = 'guess';

$content = "username=$username&password=$password";

$content_length = strlen($content);

$http_request = '';

$http_response = '';

$http_request .= "POST /login.php HTTP/1.1\r\n";

$http_request .= "Host: example.org\r\n";

$http_request .= "Content-Type: application/x-www-form-urlencoded\r\n";

$http_request .= "Content-Length: $content_length\r\n";

$http_request .= "Connection: close\r\n";

$http_request .= "\r\n";

$http_request .= $content;

if ($handle = fsockopen('example.org', 80))

{

fputs($handle, $http_request);

while (!feof($handle))

{

$http_response .= fgets($handle, 1024);

}

fclose($handle);

/* Check Response */

}

else

{

/* Error */

}

?>

使这段脚本,攻击者还可以简单地加入一个循环来继续尝试不同的存储设备,并在每次尝试后检查$http_response变量。一旦$http_response变量有变化,就可以认为猜测到了正确的存储设备。

你可以通过很多安全措施去防止此类攻击。我们注意到,在暴力攻击中每次的HTTP请求除了存储设备是不同的,其他部分完全相同,这一点是很有价值的。

尽管在超过一定数量的失败尝试后临时冻结帐号是一种有效的防范手段,但你可能会去考虑采用更确定的方式去冻结帐号,以使攻击者更少地影响合法用户对你的应用的正常使用。

还有一些流程也可以增大暴力攻击的难度,使它不太可能成功。一个简单的遏制机制就能有效地做到这一点:

<?php

/* mysql_connect() */

/* mysql_select_db() */

$clean = array();

$mysql = array();

$now = time();

$max = $now - 15;

$salt = 'SHIFLETT';

if (ctype_alnum($_POST['username']))

{

$clean['username'] = $_POST['username'];

}

else

{

/* ... */

}

$clean['password'] = md5($salt . md5($_POST['password'] . $salt));

$mysql['username'] = mysql_real_escape_string($clean['username']);

$sql = "SELECT last_failure, password

FROM users

WHERE username = '{$mysql['username']}'";

if ($result = mysql_query($sql))

{

if (mysql_num_rows($result))

{

$record = mysql_fetch_assoc($result);

if ($record['last_failure']> $max)

{

/* Less than 15 seconds since last failure */

}

elseif ($record['password'] == $clean['password'])

{

/* Successful Login */

}

else

{

/* Failed Login */

$sql = "UPDATE users

SET last_failure = '$now'

WHERE username = '{$mysql['username']}'";

mysql_query($sql);

}

}

else

{

/* Invalid Username */

}

}

else

{

/* Error */

}

?>

上例会限制在上次验证失败后对同一用户再试尝试的频率。如果在一次尝试失败后的15秒内再次尝试,不管存储设备是否正确,验证都会失败。这就是这个方案的关键点。但简单地在一次失败尝试后15秒内阻止访问还是不够的——在此时不管输入是什么,输出也会是一致的,只有在登录成功后才会不同。否则,攻击者只要简单地检查不一致的输出即可确定登录是否成功。

点击复制链接 与QQ/MSN好友分享!

分享到:

您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力
上一篇:服务端输出HTML属性的几种危险情况
下一篇:浅谈PHP的SQL注入与应对方法
相关文章

如何利用qmail防止垃圾邮件

防止W32/Fusic邮件病毒给你的电脑下钩

如何防止IP地址被被盗

Cisco路由器上如何防止DDoS

防火墙防止DDOS的几种方式

防止脚本病毒执行的通用方法

IIS防止文件下载完全手册(非更改文件名

通过限制防火墙端口防止黑客非法入侵

防止ACCESS数据库被下载的9种方法 [整

防止内部IP地址泄漏二法

图文推荐

快乐购物网短信无验证

360Shop网店系统多个

齐博cms整站系统(原P

phpcms api.php的sq

0 0