一、服务端配置
【打开安全模式】php.ini文件safe_mode=on;
【用户组安全】当safe_mode 打开时,safe_mode_gid被关闭,那么脚本能够对文件进行访问,而且相同组的用户也能够对文件进行访问。Safe_mode_gid=off
【安全模式下执行程序主目录】safe_mode_exec_dir=目录/程序/网页目录
【安全模式下包含文件】safe_mode_include_dir=文件路径
【控制php能访问的目录】open_basedir=可以访问的目录
【关闭危险函数】disable_functions=需要被禁用掉的函数名,例如system.passthru,exec,shell_exec,popen,phpinfo等,可以抵制PHPshell
【关闭PHP版本信息在http头中的泄露】expose_php=off
【关闭注册全局变量】PHP中提交的变量包括POST和GET提交的变量都将自动注册成为全局变量,能够直接访问服务器,这很不安全。Register_globals=off
【防止SQL注入】magic_quotes_gpc=on打开这个配置可以防止SQL注入,如果把它打开之后将自动把用户提交对SQL的查询进行转换。
【错误信息控制】一般禁止把服务器的错误信息(数据库连接或者其他错误信息,会暴露PHP脚本当前的路径信息或者查询的SQL语句),所以要禁止服务器错误提示display_errors=off, 显示错误信息一定要设置错误级别,比如只显示警告以上的信息error_reporting=E_WAINING&E_ERROR。建议不要开启错误提示。
【错误日志】建议在关闭display_errors之后通过日志把错误信息记录下来,便于查找服务器的错误,log_errors=on。以及错误日志的存放目录,error_log=错误日志存放路径。
二、Sql参数绑定防止注入:
<?php
/**
* 模拟简单的绑定参数过程
*
* @param string $sql SQL语句
* @param int $location 问号位置
* @param mixed $var 替换的变量
* @param string $type 替换的类型
*/
$times = 0;
//这里要注意,因为要“真正的"改变$sql的值,所以用引用传值
function bindParam(&$sql, $location, $var, $type) {
global $times;
//确定类型
switch ($type) {
//字符串
default: //默认使用字符串类型
case 'STRING' :
$var = addslashes($var); //转义
$var = "'".$var."'"; //加上单引号.SQL语句中字符串插入必须加单引号
break;
case 'INTEGER' :
case 'INT' :
$var = (int)$var; //强制转换成int
//还可以增加更多类型..
}
//寻找问号的位置
for ($i=1, $pos = 0; $i<= $location; $i++) {
$pos = strpos($sql, '?', $pos+1);
}
//替换问号
$sql = substr($sql, 0, $pos) . $var . substr($sql, $pos + 1);
}
?>