Rumah > Artikel > pembangunan bahagian belakang > Analisis kelemahan keselamatan biasa dalam audit kod PHP
Analisis kelemahan keselamatan biasa dalam audit kod PHP
Pengenalan:
Dengan aplikasi aplikasi Internet yang meluas, PHP, sebagai bahasa pembangunan yang popular, digunakan secara meluas untuk membangunkan pelbagai aplikasi Web. Walau bagaimanapun, disebabkan kaedah pembangunan PHP yang agak fleksibel, kelemahan keselamatan juga telah meningkat dengan sewajarnya. Artikel ini akan menumpukan pada menganalisis kelemahan keselamatan biasa dalam pengauditan kod PHP dan menyediakan beberapa contoh kod untuk membantu pembangun mengenali dan mengelakkan kelemahan ini.
1. SQL Injection
SQL injection bermaksud penyerang memperoleh atau mengubah suai data dalam pangkalan data dengan menyuntik pernyataan SQL yang berniat jahat ke dalam data yang dimasukkan oleh pengguna. Berikut ialah contoh kerentanan biasa:
$username = $_POST['username']; $password = $_POST['password']; $sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'"; $result = mysqli_query($conn, $sql); if(mysqli_num_rows($result) > 0){ echo "登录成功!"; }else{ echo "用户名或密码错误!"; }
Dalam kod ini, nama pengguna dan kata laluan dalam borang log masuk disambung terus ke dalam pernyataan SQL, menjadikannya terdedah kepada serangan suntikan SQL. Penyerang boleh menukar logik pernyataan SQL dengan memasukkan rentetan tertentu, atau memintas pengesahan log masuk terus dengan ' ATAU '1'='1
. ' OR '1'='1
来绕过登录验证。
解决方案:
为了避免SQL注入漏洞,应该使用预处理语句或绑定参数的方式来构建SQL语句。修改代码如下:
$username = $_POST['username']; $password = $_POST['password']; $sql = "SELECT * FROM users WHERE username = ? AND password = ?"; $stmt = mysqli_prepare($conn, $sql); mysqli_stmt_bind_param($stmt, "ss", $username, $password); mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); if(mysqli_num_rows($result) > 0){ echo "登录成功!"; }else{ echo "用户名或密码错误!"; }
二、跨站脚本攻击(XSS)
跨站脚本攻击是指攻击者通过在用户输入的数据中注入恶意脚本代码,达到窃取用户信息、篡改网页内容、发起恶意操作等目的。下面是一个常见的漏洞示例:
$name = $_GET['name']; echo "欢迎您,".$name."!";
在这个示例中,没有对用户输入的name
进行任何过滤或转义处理,攻击者可以通过构造特定的输入来注入恶意脚本,比如<script>alert('恶意代码');</script>
Untuk mengelakkan kelemahan suntikan SQL, anda harus menggunakan pernyataan yang disediakan atau parameter terikat untuk membina pernyataan SQL. Ubah suai kod seperti berikut:
$name = $_GET['name']; echo "欢迎您,".htmlspecialchars($name)."!";2. Serangan skrip merentas tapak (XSS)
Serangan skrip merentas tapak bermakna penyerang menyuntik kod skrip berniat jahat ke dalam input data oleh pengguna untuk mencuri maklumat pengguna, mengganggu kandungan halaman web , memulakan operasi berniat jahat, dsb. Tujuan. Berikut ialah contoh kerentanan biasa:
$targetDir = "uploads/"; $targetFile = $targetDir . basename($_FILES["file"]["name"]); if(move_uploaded_file($_FILES["file"]["tmp_name"], $targetFile)){ echo "文件上传成功!"; }else{ echo "文件上传失败!"; }Dalam contoh ini, tiada penapisan atau pelepasan
<script>alert('malicious code');</script>
. Penyelesaian: Untuk mengelakkan serangan XSS, data input pengguna harus ditapis dan dilepaskan. Ubah suai kod seperti berikut:
$targetDir = "uploads/"; $targetFile = $targetDir . basename($_FILES["file"]["name"]); $uploadOk = 1; $allowedTypes = array('jpg', 'jpeg', 'png', 'gif'); $allowedSize = 1024 * 1024; // 限制文件大小为1MB $fileType = strtolower(pathinfo($targetFile, PATHINFO_EXTENSION)); if(!in_array($fileType, $allowedTypes)){ $uploadOk = 0; echo "只允许上传jpg、jpeg、png、gif格式的文件!"; } if($_FILES["file"]["size"] > $allowedSize){ $uploadOk = 0; echo "文件大小超过了限制!"; } if($uploadOk){ if(move_uploaded_file($_FILES["file"]["tmp_name"], $targetFile)){ echo "文件上传成功!"; }else{ echo "文件上传失败!"; } }3. Kerentanan muat naik fail
Kerentanan muat naik fail merujuk kepada kerentanan di mana penyerang boleh melaksanakan kod sewenang-wenangnya dengan memuat naik fail berniat jahat. Berikut ialah contoh kerentanan biasa:
rrreee
Atas ialah kandungan terperinci Analisis kelemahan keselamatan biasa dalam audit kod PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!