Jaki jest odpowiednik PDO funkcji mysql real escape string?
Modyfikuję mój kod z mysql_*
Na PDO
. W kodzie miałem mysql_real_escape_string()
. Jaki jest odpowiednik tego w PDO?
5 answers
Nie, Nie ma żadnego!
Technicznie jest PDO::quote()
jest jednak rzadko używany i nie jest odpowiednikiem mysql_real_escape_string()
Zgadza się! Jeśli używasz PDO w odpowiedni sposób, jak udokumentowano za pomocą prepared statements , to ochroni Cię przed wstrzyknięciem MySQL.
# Example:
Poniżej znajduje się przykład bezpiecznego zapytania bazy danych z użyciem gotowych instrukcji (pdo)
try {
// first connect to database with the PDO object.
$db = new \PDO("mysql:host=localhost;dbname=xx;charset=utf8", "xx", "xx", [
PDO::ATTR_EMULATE_PREPARES => false,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);
} catch(\PDOException $e){
// if connection fails, show PDO error.
echo "Error connecting to mysql: " . $e->getMessage();
}
A teraz zakładając, że połączenie jest ustanowione, możesz wykonać swoje zapytanie w ten sposób.
if($_POST && isset($_POST['color'])){
// preparing a statement
$stmt = $db->prepare("SELECT id, name, color FROM Cars WHERE color = ?");
// execute/run the statement.
$stmt->execute(array($_POST['color']));
// fetch the result.
$cars = $stmt->fetchAll(\PDO::FETCH_ASSOC);
var_dump($cars);
}
Teraz, Jak widać, nie użyłem niczego, aby uciec/odkażać wartość $_POST["color"]
. A ten kod jest zabezpieczony przed myql-injection dzięki PDO i mocy przygotowanych oświadczeń.
Warto zauważyć, że należy przekazać charset=utf8
jako atrybut, w swoim DSN
Jak widać powyżej, ze względów bezpieczeństwa i zawsze włączyć
PDO, aby pokazać błędy w forma WYJĄTKÓW.
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
Więc błędy z Twoich zapytań do bazy danych nie ujawnią poufnych danych, takich jak struktura katalogów, nazwa użytkownika bazy danych itp.
Wreszcie, są chwile, kiedy nie należy ufać PDO 100% , i będzie zobowiązany do podjęcia dodatkowych środków, aby zapobiec SQL injection, jednym z tych przypadków jest, jeśli używasz przestarzałej wersji mysql [ mysql =< 5.3.6 ]
jak opisane w tej odpowiedzi
Ale, używając gotowych oświadczeń, jak pokazano powyżej zawsze będzie bezpieczniejsze, niż użycie którejkolwiek z funkcji zaczynających się od mysql_
Dobra lektura
PDO Tutorial for MySQL Developers
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-12 16:11:44
Nie ma*! Celem PDO jest to, że nie musisz przed niczym uciekać; po prostu wysyłasz je jako dane. Na przykład:
$query = $link->prepare('SELECT * FROM users WHERE username = :name LIMIT 1;');
$query->execute([':name' => $username]); # No need to escape it!
W przeciwieństwie do:
$safe_username = mysql_real_escape_string($username);
mysql_query("SELECT * FROM users WHERE username = '$safe_username' LIMIT 1;");
* Cóż, jest jeden, jak powiedział Michael Berkowski! Ale są lepsze sposoby.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-01 15:50:57
$v = '"'.mysql_real_escape_string($v).'"';
Jest odpowiednikiem $v = $this->db->quote($v);
upewnij się, że masz instancję PDO w $this->db
, więc możesz wywołać metodę PDO quote()
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-04 13:58:24
Nie ma potrzeby stosowania mysql_real_escape_string w PDO.
PDO sam dostosowuje znak specjalny w zapytaniu mysql ,wystarczy przekazać anonimowy parametr i powiązać go z czasem działania.w ten sposób Załóżmy, że masz tabelę użytkownika z nazwą atrybutu, adresem e-mail i hasłem i musisz wstawić do tego użycia instrukcję prepare w następujący sposób możesz podać nazwę jako = > $name= "Rajes ' h";
Powinno się wykonać nie ma potrzeby odpowiednika mysql_real_escape_string
$stmt="INSERT into user(name,email,password) VALUES(:name,:email,password)";
try{
$pstmt=$dbh->prepare($stmt);//$dbh database handler for executing mysql query
$pstmt->bindParam(':name',$name,PDO::PARAM_STR);
$pstmt->bindParam(':email',$email,PDO::PARAM_STR);
$pstmt->bindParam(':password',$password,PDO::PARAM_STR);
$status=$pstmt->execute();
if($status){
//next line of code
}
}catch(PDOException $pdo){
echo $pdo->getMessage();
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-25 13:08:03
Jeśli odpowiedzieć na pierwotne pytanie, to jest to odpowiednik PDO dla mysql_real_escape_string
:
function my_real_escape_string($value, $connection) {
/*
// this fails on: value="hello'";
return trim ($connection->quote($value), "'");
*/
return substr($connection->quote($value), 1, -1);
}
Btw, odpowiednik mysqli to:
function my_real_escape_string($value, $connection) {
return mysqli_real_escape_string($connection, $value);
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-30 08:02:25