Hàm PHP mysql_real_escape_string()
Định nghĩa và cách sử dụng
Hàm mysql_real_escape_string() chuyển mã các ký tự đặc biệt trong chuỗi được sử dụng trong câu lệnh SQL.
Các ký tự sau bị ảnh hưởng:
- \x00
- \n
- \r
- \
- '
- "
- \x1a
Nếu thành công, hàm này sẽ trả về chuỗi đã được chuyển mã. Nếu thất bại, sẽ trả về false.
Cú pháp
mysql_real_escape_string(string,connection)
Tham số | Mô tả |
---|---|
string | Bắt buộc. Định nghĩa chuỗi cần được chuyển mã. |
connection | Tùy chọn. Định nghĩa kết nối MySQL. Nếu không quy định, sẽ sử dụng kết nối trước đó. |
Mô tả
Hàm này sẽ string để chuyển mã các ký tự đặc biệt và考虑到连接的当前字符集,do đó có thể được sử dụng an toàn mysql_query().
Lưu ý và chú thích
Lưu ý:Bạn có thể sử dụng hàm này để ngăn chặn tấn công cơ sở dữ liệu.
Mô hình
Ví dụ 1
<?php $con = mysql_connect("localhost", "hello", "321"); if (!$con) { die('Could not connect: ' . mysql_error()); } // Mã để lấy tên người dùng và mật khẩu // Đổi mã tên người dùng và mật khẩu để sử dụng trong SQL $user = mysql_real_escape_string($user); $pwd = mysql_real_escape_string($pwd); $sql = "SELECT * FROM users WHERE user='" . $user . "' AND password='" . $pwd . "'" // Một số mã thêm mysql_close($con); ?>
Ví dụ 2
Tấn công cơ sở dữ liệu. Ví dụ này minh họa điều gì sẽ xảy ra nếu chúng ta không áp dụng hàm mysql_real_escape_string() cho tên người dùng và mật khẩu:
<?php $con = mysql_connect("localhost", "hello", "321"); if (!$con) { die('Could not connect: ' . mysql_error()); } $sql = "SELECT * FROM users WHERE user='{$_POST['user']}' AND password='{$_POST['pwd']}'"; mysql_query($sql); // Không kiểm tra tên người dùng và mật khẩu // Có thể là bất kỳ nội dung nào được nhập bởi người dùng, ví dụ: $_POST['user'] = 'john'; $_POST['pwd'] = "' OR ''='"; // Một số mã... mysql_close($con); ?>
Vậy truy vấn SQL sẽ trở thành như thế này:
SELECT * FROM users WHERE user='john' AND password='' OR ''=''
Điều này có nghĩa là bất kỳ người dùng nào cũng không cần nhập mật khẩu hợp lệ để đăng nhập.
Ví dụ 3
Cách làm đúng để phòng ngừa tấn công cơ sở dữ liệu:
<?php function check_input($value) { // Loại bỏ dấu gạch chéo if (get_magic_quotes_gpc()) { $value = stripslashes($value); } // Nếu không phải số thì thêm dấu ngoặc kép if (!is_numeric($value)) { $value = "'" . mysql_real_escape_string($value) . "'"; } return $value; } $con = mysql_connect("localhost", "hello", "321"); if (!$con) { die('Could not connect: ' . mysql_error()); } // Thực hiện SQL an toàn $user = check_input($_POST['user']); $pwd = check_input($_POST['pwd']); $sql = "SELECT * FROM users WHERE user=$user AND password=$pwd"; mysql_query($sql); mysql_close($con); ?>