PHP安全编程
转自:http://www.nowamagic.net/librarys/veda/detail/2076
1.关闭register_globals,以提高安全性
2.在部署环境,不要让不相关的人看到报错信息,可以如此设置:
ini_set(‘error_reporting‘, E_ALL | E_STRICT); ini_set(‘display_errors‘, ‘Off‘); ini_set(‘log_errors‘, ‘On‘); ini_set(‘error_log‘, ‘/usr/local/apache/logs/error_log‘);
或者设置错误处理函数:
set_error_handler(‘my_error_handler‘);
function my_error_handler($number, $string, $file, $line, $context) { $error = "= == == == ==\nPHP ERROR\n= == == == ==\n"; $error .= "Number: [$number]\n"; $error .= "String: [$string]\n"; $error .= "File: [$file]\n"; $error .= "Line: [$line]\n"; $error .= "Context:\n" . print_r($context, TRUE) . "\n\n"; error_log($error, 3, ‘/usr/local/apache/logs/error_log‘); }
3.深度防范/最小权限/简单就是美/暴露最小化原则
4.平衡风险与可用性/跟踪数据
5.过滤用户输入
6.对输出要转义
7.利用session相关机制来避免URL语义攻击
8.防御文件上传攻击
10.利用POST和Token来降低CSRF的风险
11.不要使用HTTP的头中的Referer,而是采用过滤输入的方式来避免欺骗表单的提交
12.还是采用过滤输入的方式来避免欺骗HTTP的接受
13.不要将配置文件放在根目录,也不要采用其他的特殊后缀名,防止暴露配置信息
14.利用"过滤输入,转义输出"的原则来降低SQL注入风险
15.通过防止CSRF漏洞和修复暴露cookie的浏览器漏洞相结合来防止cookie盗窃
16.Session回话固定
17.源代码的暴露
18.为了阻止文件名被操控,当然最有效的方法就是过滤输入,此时之外,还有以下几个方法
19.通过限制登录次数或登录间隔,来限制暴力破解攻击
20.攻击者可以用抓包软件来嗅探用户密码,最好的方法是采用HTTPS
21.攻击者得到密码后,就可以进行重播攻击,可以采取的防御为
22.如果非要进行永久访问权的使用,可以采用的方法为
$salt = ‘SHIFLETT‘; $identifier = md5($salt . md5($username . $salt)); $token = md5(uniqid(rand(), TRUE)); $timeout = time() + 60 * 60 * 24 * 7; setcookie(‘auth‘, "$identifier:$token", $timeout);
2)验证
$clean = array(); $mysql = array(); $now = time(); $salt = ‘SHIFLETT‘; list($identifier, $token) = explode(‘:‘, $_COOKIE[‘auth‘]); if (ctype_alnum($identifier) && ctype_alnum($token)) { $clean[‘identifier‘] = $identifier; $clean[‘token‘] = $token; } else { /* ... */ } $mysql[‘identifier‘] = mysql_real_escape_string($clean[‘identifier‘]); $sql = "SELECT username, token, timeout FROM users WHERE identifier = ‘{$mysql[‘identifier‘]}‘"; if ($result = mysql_query($sql)) { if (mysql_num_rows($result)) { $record = mysql_fetch_assoc($result); if ($clean[‘token‘] != $record[‘token‘]) { /* Failed Login (wrong token) */ } elseif ($now > $record[‘timeout‘]) { /* Failed Login (timeout) */ } elseif ($clean[‘identifier‘] != md5($salt . md5($record[‘username‘] . $salt))) { /* Failed Login (invalid identifier) */ } else { /* Successful Login */ } } else { /* Failed Login (invalid identifier) */ } } else { /* Error */ }
setcookie(‘auth‘, ‘DELETED!‘, time());
23.尽量将Session数据保存在Mysql或Memcache中,减少因文件被操控后被猜中后泄露和操控的机会
24.PHP安全模式生效时,PHP会对正在执行的脚本所读取(或所操作)文件的属主进行检查,以保证与该脚本的属主是相同的,他是一种深度防范
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。