Dengan perkembangan teknologi Internet yang berterusan, isu keselamatan tapak web dan aplikasi telah menarik lebih banyak perhatian. Antaranya, serangan suntikan SQL adalah kaedah serangan biasa, dan laman web serta aplikasi yang ditulis dalam PHP sangat terdedah kepada serangan. Oleh itu, artikel ini akan memperkenalkan cara mengelakkan serangan suntikan SQL dalam fail PHP untuk memastikan keselamatan laman web dan aplikasi.
Pernyataan yang disediakan ialah cara penting untuk mencegah serangan suntikan SQL. Ia memisahkan pernyataan dan parameter SQL, dengan itu mengelakkan kemungkinan serangan yang disebabkan oleh input yang tidak betul. Kenyataan yang disediakan yang biasa digunakan dalam PHP termasuk PDO dan MySQLi. Berikut ialah contoh penggunaan PDO:
//连接数据库 $pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password'); //预处理SQL语句 $stmt = $pdo->prepare('SELECT * FROM users WHERE username = :username AND password = :password'); //绑定参数 $stmt->bindParam(':username', $username); $stmt->bindParam(':password', $password); //执行查询 $stmt->execute();
Pertanyaan berparameter adalah serupa dengan pernyataan yang disediakan, dan juga memisahkan pernyataan dan parameter SQL. Perbezaannya ialah pertanyaan berparameter merujuk kepada menggunakan ruang letak untuk menggantikan parameter dalam pernyataan SQL dan menghantar parameter kepada fungsi pertanyaan secara individu. Berikut ialah contoh menggunakan MySQLi:
//连接数据库 $conn = mysqli_connect('localhost', 'username', 'password', 'test'); //参数化查询 $stmt = mysqli_prepare($conn, 'SELECT * FROM users WHERE username = ? AND password = ?'); mysqli_stmt_bind_param($stmt, 'ss', $username, $password); mysqli_stmt_execute($stmt);
Input pengguna hendaklah ditapis dan disahkan dengan betul sebelum ia digunakan sebagai kriteria pertanyaan SQL. Fungsi penapisan yang biasa digunakan dalam PHP termasuk htmlspecialchars() dan strip_tags(), yang boleh menapis keluar tag HTML dan aksara khas. Contohnya:
//使用htmlspecialchars()过滤用户输入 $username = htmlspecialchars($_POST['username'], ENT_QUOTES, 'UTF-8'); $password = htmlspecialchars($_POST['password'], ENT_QUOTES, 'UTF-8'); //查询用户 $stmt = $pdo->query("SELECT * FROM users WHERE username = '{$username}' AND password = '{$password}'");
Sebelum menggunakan input pengguna sebagai syarat pertanyaan SQL, anda juga harus menyemak sama ada jenis pembolehubahnya adalah betul. Sebagai contoh, apabila input pengguna ialah rentetan, ia perlu disertakan dalam tanda petikan; apabila input pengguna ialah nombor, ia tidak perlu disertakan dalam tanda petikan. Fungsi semakan jenis yang biasa digunakan dalam PHP termasuk is_numeric() dan is_string(), yang boleh membantu kami menyemak sama ada pembolehubah ialah nombor dan rentetan. Contohnya:
$username = $_POST['username']; if (is_string($username)) { //将字符串用引号括起来 $username = "'" . $username . "'"; } $password = $_POST['password']; if (is_string($password)) { //将字符串用引号括起来 $password = "'" . $password . "'"; } //查询用户 $stmt = $pdo->query("SELECT * FROM users WHERE username = {$username} AND password = {$password}");
Ringkasnya, serangan suntikan SQL ialah kaedah serangan yang berbahaya dan biasa, dan langkah yang berkesan mesti diambil untuk mencegahnya. Artikel ini memperkenalkan beberapa kaedah untuk mengelakkan serangan suntikan SQL, seperti pernyataan yang disediakan, pertanyaan berparameter, input penapisan dan menyemak jenis pembolehubah Saya harap ia akan membantu pembangun PHP.
Atas ialah kandungan terperinci Bagaimana untuk mengelakkan serangan suntikan SQL dalam fail PHP?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!