Rumah >pembangunan bahagian belakang >tutorial php >Reka bentuk bahagian belakang PHP: penerokaan keselamatan dan kawalan kebenaran

Reka bentuk bahagian belakang PHP: penerokaan keselamatan dan kawalan kebenaran

WBOY
WBOYasal
2024-01-19 10:14:05816semak imbas

Reka bentuk bahagian belakang PHP: penerokaan keselamatan dan kawalan kebenaran

Dengan populariti Internet dan aplikasi Web, PHP telah menjadi salah satu bahasa bahagian belakang yang paling popular. Walau bagaimanapun, pembangunan bahagian belakang PHP melibatkan isu keselamatan dan kawalan kebenaran yang sangat penting.

Dalam artikel ini, kami akan meneroka keselamatan dan kawalan kebenaran dalam reka bentuk bahagian belakang PHP dan menyediakan contoh kod khusus untuk membantu pembaca memahami isu ini dengan lebih baik. Isu keselamatan yang menggunakan input pertanyaan SQL untuk memanipulasi atau melihat data. Untuk mengelakkan serangan suntikan SQL, kita perlu melindungi diri kita semasa menulis kod.

Berikut ialah contoh suntikan SQL mudah:

$username = $_POST['username'];

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

Dalam contoh ini, penyerang boleh memintas input pengguna dengan memasukkan ' atau 1=1 -- dan mendapatkan data keseluruhan jadual pengguna . Untuk mengelakkan perkara ini berlaku, kita perlu menggunakan pernyataan yang disediakan dalam PHP.

    Kod sampel yang diubah suai adalah seperti berikut:
  1. $username = $_POST['username'];
    
    $stmt = $pdo->prepare("SELECT * FROM user WHERE username=?");
    $stmt->execute([$username]);
    
    $user = $stmt->fetch();
  2. Dalam contoh ini, kami menggunakan pernyataan yang disediakan dalam PDO untuk memisahkan kandungan input pengguna daripada pernyataan SQL. Ini boleh mengelakkan serangan suntikan SQL dengan berkesan.

XSS Attack

XSS attack ialah teknik yang mengeksploitasi kelemahan dalam aplikasi web dan membenarkan penyerang menyuntik tag HTML atau kod JavaScript ke dalam penyemak imbas pengguna. Untuk mengelakkan serangan XSS, kita perlu menggunakan fungsi htmlspecialchars() untuk menapis input pengguna. ' or 1=1 -- 的方式来绕过用户输入的内容,并获取到整张用户表的数据。为了防止这种情况发生,我们需要用到PHP中的预处理语句。

修改后的示例代码如下:

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

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

  1. XSS攻击

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

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

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

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

Berikut ialah contoh serangan XSS yang mudah:

<!-- 在攻击者的网站上 -->
<img  src="http://localhost/delete.php?id=1" alt="Reka bentuk bahagian belakang PHP: penerokaan keselamatan dan kawalan kebenaran" >

Penyerang boleh menghantar kod JavaScript sebagai parameter nama pengguna, contohnya: http://localhost/welcome.php?username=<script>alert( " XSS!")</script>, supaya kotak amaran boleh muncul dalam penyemak imbas pengguna.

Untuk mengelakkan perkara ini berlaku, kita perlu menggunakan fungsi htmlspecialchars() untuk menapis kandungan yang dimasukkan oleh pengguna. Kod yang diubah suai adalah seperti berikut:
    <!-- 在表单中添加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>
  1. Dalam contoh ini, kami menggunakan fungsi htmlspecialchars() untuk menapis kandungan yang dimasukkan oleh pengguna, supaya serangan XSS dapat dielakkan.

CSRF Attack

Serangan CSRF ialah sejenis kerentanan yang mengeksploitasi aplikasi web Penyerang boleh membina halaman atau URL yang membolehkan pengguna melakukan tindakan tertentu tanpa pengetahuan mereka. Untuk mengelakkan serangan CSRF, kita perlu menggunakan token CSRF atau dasar asal yang sama.

Berikut ialah contoh serangan CSRF yang mudah:

if (! check_user_permission('admin')) {
  die("Permission denied!");
}

// 进行敏感操作

Penyerang membenarkan pengguna melawat halaman ini dengan menghantar e-mel kepada pengguna atau menerbitkan catatan blog. Halaman ini akan memadamkan rekod dengan id 1 tanpa pengetahuan pengguna.

Untuk mengelakkan perkara ini berlaku, kita perlu menggunakan token CSRF atau polisi asal yang sama. Kod sampel adalah seperti berikut:

// 用户与角色映射关系
$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!");
}

// 进行敏感操作

Dalam contoh ini, kami menggunakan token CSRF untuk menghalang penyerang berniat jahat daripada membina halaman atau URL untuk menyerang sistem kami.

2. Isu kawalan kebenaran
  1. Apabila melibatkan isu kawalan kebenaran PHP, ia melibatkan aspek berikut:

Pengesahan

Untuk memastikan keselamatan sistem, identiti pengguna mesti disahkan. Pengesahan diperlukan sebelum memproses operasi sensitif.

Kod sampel adalah seperti berikut:
    rrreee
  1. Dalam contoh ini, kami menggunakan fungsi check_user_permission() untuk menyemak sama ada pengguna mempunyai kebenaran untuk beroperasi. Jika pengguna tidak mempunyai kebenaran, operasi ditamatkan.

Kawalan Peranan

Pengguna yang berbeza dalam sistem mungkin memerlukan kebenaran dan skop operasi yang berbeza. Untuk mencapai kawalan kebenaran jenis ini, kaedah kawalan peranan biasanya digunakan.

Kod sampel adalah seperti berikut:

rrreee

Dalam contoh ini, kami mentakrifkan hubungan pemetaan antara peranan dan kebenaran, dan menggunakan fungsi check_user_permission() untuk menyemak sama ada pengguna mempunyai kebenaran untuk beroperasi. Jika pengguna tidak mempunyai kebenaran, operasi ditamatkan.

Di atas ialah beberapa perbincangan tentang isu keselamatan dan kawalan kebenaran dalam reka bentuk bahagian belakang PHP. Kami mengesyorkan agar pembangun meningkatkan pembelajaran dan pemahaman mereka tentang isu ini semasa proses pembangunan sebenar, dan mematuhi amalan terbaik untuk kawalan keselamatan dan kebenaran semasa menulis kod. 🎜🎜Jika anda mempunyai sebarang pertanyaan lanjut atau memerlukan bantuan lanjut, sila hubungi kami. 🎜

Atas ialah kandungan terperinci Reka bentuk bahagian belakang PHP: penerokaan keselamatan dan kawalan kebenaran. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn