PHP mysql_real_escape_string() -funktionen
Definition och användning
mysql_real_escape_string() -funktionen omvandlar specialtecken i strängen som används i SQL-satsen.
Följande tecken påverkas:
- \x00
- \n
- \r
- \
- '
- "
- \x1a
Om det lyckas returnerar denna funktion den omvandlade strängen. Om det misslyckas returneras false.
Syntaks
mysql_real_escape_string(string,connection)
Parameter | Beskrivning |
---|---|
string | Obligatorisk. Ange strängen som ska omvandlas. |
connection | Valfri. Ange MySQL-anslutning. Om den inte anges används den senaste anslutningen. |
Beskrivning
Denna funktion kommer att string där specialtecken omvandlas till escape-tecken och beaktar den aktuella teckenuppsättningen för anslutningen, så den kan användas säkert för mysql_query().
Tips och kommentarer
Tips:Du kan använda denna funktion för att förhindra databasangrepp.
Exempel
Exempel 1
<?php $con = mysql_connect("localhost", "hello", "321"); if (!$con) { die('Could not connect: ' . mysql_error()); } // Koden för att få användarnamn och lösenord // Omvandla användarnamn och lösenord för att använda i SQL $user = mysql_real_escape_string($user); $pwd = mysql_real_escape_string($pwd); $sql = "SELECT * FROM users WHERE user='" . $user . "' AND password='" . $pwd . "'" // Mer kod mysql_close($con); ?>
Exempel 2
Databasangrepp. Detta exempel visar vad som händer om vi inte använder mysql_real_escape_string() -funktionen för användarnamn och lösenord:
<?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); // Kontrollerar inte användarnamn och lösenord // Kan vara vilket inmatat innehåll som helst av användaren, till exempel: $_POST['user'] = 'john'; $_POST['pwd'] = "' OR ''='"; // Några kod... mysql_close($con); ?>
Så kommer SQL-frågan att se ut:
SELECT * FROM users WHERE user='john' AND password='' OR ''=''
这意味着任何用户无需输入合法的密码即可登录。
例子 3
预防数据库攻击的正确做法:
<?php function check_input($value) { // 去除斜杠 if (get_magic_quotes_gpc()) { $value = stripslashes($value); } // 如果不是数字则加引号 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()); } // 进行安全的 SQL $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); ?>