Maison  >  Article  >  développement back-end  >  Conception du backend PHP : exploration de la sécurité et du contrôle des autorisations

Conception du backend PHP : exploration de la sécurité et du contrôle des autorisations

WBOY
WBOYoriginal
2024-01-19 10:14:05733parcourir

Conception du backend PHP : exploration de la sécurité et du contrôle des autorisations

Avec la popularité d'Internet et des applications Web, PHP est devenu l'un des langages backend les plus populaires. Cependant, le développement du backend PHP implique des problèmes de sécurité et de contrôle des autorisations très importants.

Dans cet article, nous explorerons la sécurité et le contrôle des autorisations dans la conception du backend PHP et fournirons des exemples de code spécifiques pour aider les lecteurs à mieux comprendre ces problèmes.

1. Problèmes de sécurité

Lorsqu'il s'agit de problèmes de sécurité PHP, cela implique principalement les aspects suivants :

  1. Attaque par injection SQL

L'injection SQL est une méthode qui exploite les vulnérabilités des applications Web et peut être manipulée. Une méthode d'attaque qui utilise l'entrée de requête SQL pour manipuler ou afficher des données. Pour éviter les attaques par injection SQL, nous devons nous protéger lors de l'écriture du code.

Ce qui suit est un exemple simple d'injection SQL :

$username = $_POST['username'];

$sql = "SELECT * FROM user WHERE username='$username'";

Dans cet exemple, l'attaquant peut contourner la saisie de l'utilisateur en entrant ' ou 1=1 -- et obtenir les données de l'ensemble de la table utilisateur. . Pour éviter que cela ne se produise, nous devons utiliser des instructions préparées en PHP. ' or 1=1 -- 的方式来绕过用户输入的内容,并获取到整张用户表的数据。为了防止这种情况发生,我们需要用到PHP中的预处理语句。

修改后的示例代码如下:

$username = $_POST['username'];

$stmt = $pdo->prepare("SELECT * FROM user WHERE username=?");
$stmt->execute([$username]);

$user = $stmt->fetch();

这个示例中,我们使用了PDO中的预处理语句,将用户输入的内容与SQL语句分离开来。这样可以有效地避免SQL注入的攻击。

  1. XSS攻击

XSS攻击是一种利用Web应用程序的漏洞,攻击者可以将HTML标签或JavaScript代码注入到用户浏览器中的技术。为了避免XSS攻击,我们需要使用htmlspecialchars()函数来过滤用户输入的内容。

以下是一个简单的XSS攻击示例:

echo "Welcome, " . $_GET['username'] . "!";

攻击者可以传递一个JavaScript代码作为username的参数,例如:http://localhost/welcome.php?username=<script>alert("XSS!")</script>

L'exemple de code modifié est le suivant :

echo "Welcome, " . htmlspecialchars($_GET['username'], ENT_QUOTES, 'UTF-8') . "!";

Dans cet exemple, nous utilisons les instructions préparées dans PDO pour séparer le contenu saisi par l'utilisateur de l'instruction SQL. Cela peut efficacement éviter les attaques par injection SQL.

    XSS Attack
L'attaque XSS est une technique qui exploite les vulnérabilités des applications Web et permet aux attaquants d'injecter des balises HTML ou du code JavaScript dans le navigateur de l'utilisateur. Afin d'éviter les attaques XSS, nous devons utiliser la fonction htmlspecialchars() pour filtrer les entrées de l'utilisateur.

Ce qui suit est un exemple simple d'attaque XSS :

<!-- 在攻击者的网站上 -->
<img  src="http://localhost/delete.php?id=1" alt="Conception du backend PHP : exploration de la sécurité et du contrôle des autorisations" >

L'attaquant peut transmettre un code JavaScript comme paramètre de nom d'utilisateur, par exemple : http://localhost/welcome.php?username=<script>alert( " XSS!")</script>, afin qu'une boîte d'avertissement puisse apparaître dans le navigateur de l'utilisateur.

Afin d'éviter que cela ne se produise, nous devons utiliser la fonction htmlspecialchars() pour filtrer le contenu saisi par l'utilisateur. Le code modifié est le suivant :

<!-- 在表单中添加CSRF令牌 -->
<form action="delete.php" method="POST">
  <input type="hidden" name="token" value="<?php echo md5(session_id()); ?>">
  <input type="hidden" name="id" value="1">
  <button type="submit" class="btn btn-danger">删除</button>
</form>

Dans cet exemple, nous utilisons la fonction htmlspecialchars() pour filtrer le contenu saisi par l'utilisateur, afin d'éviter les attaques XSS.

Attaque CSRF

Une attaque CSRF est un type de vulnérabilité qui exploite une application Web. Un attaquant peut construire une page ou une URL qui permet aux utilisateurs d'effectuer certaines actions à leur insu. Pour éviter les attaques CSRF, nous devons utiliser des jetons CSRF ou la même politique d'origine.
  1. Ce qui suit est un exemple d'attaque CSRF simple :
  2. if (! check_user_permission('admin')) {
      die("Permission denied!");
    }
    
    // 进行敏感操作
L'attaquant permet à l'utilisateur de visiter cette page en envoyant un e-mail à l'utilisateur ou en publiant un article de blog. Cette page supprimera l'enregistrement portant l'identifiant 1 à l'insu de l'utilisateur.

Pour éviter que cela ne se produise, nous devons utiliser un jeton CSRF ou une politique de même origine. L'exemple de code est le suivant :

// 用户与角色映射关系
$users = [
  'Alice' => ['admin'],
  'Bob' => ['editor'],
  'Charlie' => ['editor', 'viewer'],
];

// 检查当前用户的角色
function get_user_roles($username) {
  global $users;
  return $users[$username] ?? [];
}

// 检查用户是否有权限
function check_user_permission($username, $permission) {
  $roles = get_user_roles($username);
  foreach ($roles as $role) {
    if (isset($permissions[$role]) && $permissions[$role][$permission]) {
      return true;
    }    
  }
  return false;
}

// 定义角色与权限映射关系
$permissions = [
  'admin' => ['create', 'update', 'delete'],
  'editor' => ['create', 'update'],
  'viewer' => ['view'],
];

// 检查用户是否有权限
if (!check_user_permission('Alice', 'delete')) {
  die("Permission denied!");
}

// 进行敏感操作

Dans cet exemple, nous utilisons un jeton CSRF pour empêcher les attaquants malveillants de construire des pages ou des URL pour attaquer notre système.

2. Problèmes de contrôle des autorisations
  1. En ce qui concerne les problèmes de contrôle des autorisations PHP, cela implique principalement les aspects suivants :

Authentification

Afin d'assurer la sécurité du système, l'identité de l'utilisateur doit être authentifiée. L'authentification est requise avant de traiter des opérations sensibles.

L'exemple de code est le suivant :

rrreee

Dans cet exemple, nous utilisons la fonction check_user_permission() pour vérifier si l'utilisateur a l'autorisation d'opérer. Si l'utilisateur n'a pas l'autorisation, l'opération est terminée.

🎜Contrôle des rôles🎜🎜🎜 Différents utilisateurs du système peuvent avoir besoin de différentes autorisations et étendues d'opération. Afin d’obtenir ce type de contrôle des autorisations, la méthode de contrôle des rôles est généralement utilisée. 🎜🎜L'exemple de code est le suivant : 🎜rrreee🎜Dans cet exemple, nous définissons la relation de mappage entre les rôles et les autorisations, et utilisons la fonction check_user_permission() pour vérifier si l'utilisateur a l'autorisation d'opérer. Si l'utilisateur n'a pas l'autorisation, l'opération est terminée. 🎜🎜Ce qui précède est une discussion sur les problèmes de sécurité et de contrôle des autorisations dans la conception du backend PHP. Nous recommandons aux développeurs d'améliorer leur apprentissage et leur compréhension de ces problèmes au cours du processus de développement lui-même, et d'adhérer aux meilleures pratiques en matière de sécurité et de contrôle des autorisations lors de l'écriture du code. 🎜🎜Si vous avez d'autres questions ou avez besoin d'aide supplémentaire, n'hésitez pas à nous contacter. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn