real_escape_string
تابع real_escape_string کار «فراردهی رشته (String Escaping)» را انجام می دهد. یعنی کاراکترهای خاص را امن می کند تا در پرس وجوی SQL خرابکاری نکنند. این تابع با توجه به «مجموعه کاراکتر اتصال» کار می کند.
real_escape_string دقیقا چه می کند؟
این تابع کاراکترهای ویژه را به نسخه امن تبدیل می کند. سپس رشته حاصل در کوئری SQL استفاده می شود. بنابراین رشته نهایی از نظر سینتکسی «قانونی» است و خطا نمی دهد.
سینتکس شیءگرا (Object Oriented)
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "my_db");
if ($mysqli->connect_errno) {
echo "Failed to connect to MySQL: " . $mysqli->connect_error;
exit();
}
$firstname = $mysqli->real_escape_string($_POST['firstname']);
$lastname = $mysqli->real_escape_string($_POST['lastname']);
$age = $mysqli->real_escape_string($_POST['age']);
$sql = "INSERT INTO Persons (FirstName, LastName, Age) VALUES ('$firstname', '$lastname', '$age')";
if (!$mysqli->query($sql)) {
printf("%d Row inserted.\n", $mysqli->affected_rows);
}
$mysqli->close();
?>
سینتکس رویه ای (Procedural)
<?php
$con = mysqli_connect("localhost", "my_user", "my_password", "my_db");
if (mysqli_connect_errno()) {
echo "Failed to connect to MySQL: " . mysqli_connect_error();
exit();
}
$firstname = mysqli_real_escape_string($con, $_POST['firstname']);
$lastname = mysqli_real_escape_string($con, $_POST['lastname']);
age = mysqli_real_escape_string($con, $_POST['age']);
$sql = "INSERT INTO Persons (FirstName, LastName, Age) VALUES ('$firstname', '$lastname', '$age')";
if (!mysqli_query($con, $sql)) {
printf("%d Row inserted.\n", mysqli_affected_rows($con));
}
mysqli_close($con);
?>
گام های عملی با real_escape_string
- اتصال را بساز و بررسی کن.
- هر ورودی را با real_escape_string امن کن.
- رشته امن شده را داخل کوئری قرار بده.
- کوئری را اجرا کن و نتیجه را بررسی کن.
چه کاراکترهایی امن می شوند؟
NUL، \n، ، \\, '\'', "\"" و Control-Z تبدیل می شوند. بنابراین رشته شما برای SQL «قانونی» می ماند.
نکته: برای ساخت کوئری ایمن تر، از prepare و پارامترها هم استفاده کن. اما اگر رشته باید مستقیم داخل SQL برود، فراردهی رشته ضروری است.
جمع بندی سریع
- real_escape_string رشته SQL را قانونی می کند.
- ورودی ها را همیشه قبل از کوئری امن کن.
- به مجموعه کاراکتر اتصال توجه کن.
- برای درج ها، نتیجه را بررسی کن.
- ترجیحا از prepare استفاده کن.