PHP mysql_real_escape_string()-funktio
Määrittely ja käyttö
mysql_real_escape_string()-funktio kääntää SQL-kyselyssä käytettävien merkkijonojen erikoismerkit.
Seuraavat merkit kärsivät vaikutuksesta:
- \x00
- \n
- \r
- \
- '
- "
- \x1a
Jos toimenpide onnistuu, funktio palauttaa käännetyn merkkijonon. Jos toimenpide epäonnistuu, palauttaa false.
Syntaksi
mysql_real_escape_string(string,connection)
Parametrit | Kuvaus |
---|---|
string | Vakio. Määritä käännettävä merkkijono. |
connection | Valinnainen. Määritä MySQL-yhteys. Jos sitä ei määritetä, käytetään edellistä yhteyttä. |
Kuvaus
Tämä funktio string erikoismerkit käännetään, ja otetaan huomioon nykyinen yhdistetyksen merkistö, joten sitä voidaan käyttää mysql_query().
Vinkit ja huomiot
Vinkki:Voit käyttää tätä funktiota suojautumaan tietokantahyökkäyksiltä.
Esimerkki
Esimerkki 1
<?php $con = mysql_connect("localhost", "hello", "321"); if (!$con) { die('Could not connect: ' . mysql_error()); } // Saadaan käyttäjänimi ja salasana // Käytä kirjaimia ja merkkejä SQL:ssä $user = mysql_real_escape_string($user); $pwd = mysql_real_escape_string($pwd); $sql = "SELECT * FROM users WHERE user='" . $user . "' AND password='" . $pwd . "'" // Lisää koodia mysql_close($con); ?>
Esimerkki 2
Tietokantahyökkäys. Tämä esimerkki näyttää, mitä tapahtuu, jos emme sovellakaan mysql_real_escape_string()-funktiota käyttäjänimiin ja salasanaan:
<?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); // Ei tarkisteta käyttäjänimiä ja salasanoja // Voisi olla käyttäjän syöttämä sisältö, kuten: $_POST['user'] = 'john'; $_POST['pwd'] = "' OR ''='"; // Jotain koodia... mysql_close($con); ?>
Sitten SQL-kysely tulee olemaan tällainen:
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); ?>