实现PHP基本安全主要包括以下几个方面:
一、文件目录安全
-
确保文件权限安全:web服务器必须拥有读取和执行文件的权限,而其他人所拥有的权限最好不能超过只读,不应该写或执行等敏感操作。将文件权限设置为644或755即可。为了提高安全性,应尽可能将敏感文件(如配置文件、日志文件等)放在非web目录下。
-
确保目录安全:为了防止用户通过URL访问到敏感的目录,可以在根目录下新建.htaccess文件,添加同源策略或访问控制命令,如以下代码:
# Same Origin Policy
Header set Access-Control-Allow-Origin "*"
# Forbidden directory listing
Options -Indexes
# Deny access to specific directories
<Directory /var/www/example.com/secure>
Order Deny,Allow
Deny from all
</Directory>
二、防范SQL注入攻击
- 使用预处理语句:将数据与SQL命令分离,并先为每个变量准备一个问号占位符,这样能确保SQL参数在发送到数据库核心之前得到适当的转义处理,防止攻击者在SQL语句中注入恶意命令。例如:
$stmt = $pdo->prepare('INSERT INTO users (name, email, password) VALUES (?, ?, ?)');
$stmt->execute([$name, $email, $hashedPassword]);
- 使用数据过滤和清理:对所有HTTP POST和GET请求的输入数据进行过滤和清理,删除非字母数字字符和特殊字符,使用mysqli_real_escape_string或PDO Quote函数将所有输入转义,以防止不受信任的数据进入数据库。例如:
$username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
$password = filter_input(INPUT_POST, 'password', FILTER_SANITIZE_STRING);
$passwordHash = password_hash($password, PASSWORD_DEFAULT);
示例说明
示例1:文件目录安全
假设网站根目录下有一个nomedia目录,禁止通过URL访问。
- 在nomedia目录下放置一个 index.html,其内容为:
<!doctype html>
<html>
<head>
<title>Access Denied</title>
</head>
<body>
<h1>Denied for security reasons</h1>
</body>
</html>
- 在网站根目录下新建.htaccess文件,添加以下代码:
<Directory /path/to/website/nomedia>
Order Deny,Allow
Deny from All
</Directory>
Options -Indexes
这样访问http://example.com/nomedia/就会显示Access Denied页面。
示例2:防范SQL注入攻击
假设网站有一个注册页面,用户可以提交用户名、电子邮件和密码,将这些数据存储在数据库中。
- 使用PDO的预处理语句:
try {
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
$stmt = $dbh->prepare('INSERT INTO users (name, email, password) VALUES (?, ?, ?)');
$stmt->execute(array($name, $email, $passwordHash));
echo "Registration successful!";
} catch (PDOException $e) {
echo 'Error: ' . $e->getMessage();
}
- 使用数据过滤和清理:
$username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
$password = filter_input(INPUT_POST, 'password', FILTER_SANITIZE_STRING);
$passwordHash = password_hash($password, PASSWORD_DEFAULT);
以上例子演示了如何使用预处理语句和数据过滤函数防范SQL注入攻击,同时也简单介绍了如何使用PDO扩展访问数据库。除此之外,还可以使用ORM框架如Laravel,提供更丰富的安全性能。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PHP安全技术之 实现php基本安全 - Python技术站