source

mysql_real_escape_string 함수의 PDO는 무엇입니까?

gigabyte 2022. 11. 8. 21:09
반응형

mysql_real_escape_string 함수의 PDO는 무엇입니까?

코드를 수정하고 있습니다.mysql_*로.PDO내 코드로 나는 가지고 있었다.mysql_real_escape_string()PDO에서 이것과 동등한 것은 무엇입니까?

아니, 없어!

기술적으로는 있습니다만, 거의 사용되지 않고, 다음에 상당하는 것은 아닙니다.

맞아요!이미 준비된 문을 사용하여 문서화된 대로 PDO를 사용하는 경우 MySQL 주입으로부터 보호합니다.


#Example:

다음은 준비된 문(pdo)을 사용한 안전한 데이터베이스 쿼리의 예입니다.

  try {
     // first connect to database with the PDO object. 
     $db = new \PDO("mysql:host=localhost;dbname=xxx;charset=utf8", "xxx", "xxx", [
       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();
 }

그리고 연결이 확립되었다고 가정하면 다음과 같이 쿼리를 실행할 수 있습니다.

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); 
 }

보시다시피, 저는 이 제품의 가치를 탈피/위생화하기 위해 어떤 것도 사용하지 않았습니다.$_POST["color"]이 코드는 PDO와 준비된 스테이트먼트의 기능을 통해 myql-injection으로부터 안전합니다.


주의할 필요가 있습니다.charset=utf8속성으로서DSN위의 보안상의 이유로 PDO가 예외 형식으로 오류를 표시할 수 있도록 합니다.

PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION

따라서 데이터베이스 쿼리에서 발생한 오류로 인해 디렉토리 구조, 데이터베이스 사용자 이름 등의 중요한 데이터가 노출되지 않습니다.

마지막으로 PDO를 100% 신뢰해서는 안 되며 SQL 주입을 방지하기 위해 몇 가지 추가 조치를 취해야 하는 경우가 있습니다.그 중 하나는 오래된 버전의 mysql을 사용하는 경우입니다.[ mysql =< 5.3.6 ] 답변에 기술된 바와 같이

단, 위와 같이 준비된 문장을 사용하는 것이 다음 문자로 시작하는 함수를 사용하는 것보다 항상 안전합니다.mysql_

좋은 읽을거리

MySQL 개발자용 PDO 튜토리얼

없습니다*!PDO의 목적은 아무것도 회피할 필요가 없고, 데이터로서 송신하는 것입니다.예를 들어 다음과 같습니다.

$query = $link->prepare('SELECT * FROM users WHERE username = :name LIMIT 1;');
$query->execute([':name' => $username]); # No need to escape it!

대조를 이루는 것:

$safe_username = mysql_real_escape_string($username);
mysql_query("SELECT * FROM users WHERE username = '$safe_username' LIMIT 1;");

* 음, 마이클 버코스키가 말했듯이, 하나 있어요!하지만 더 좋은 방법이 있어요.

$v = '"'.mysql_real_escape_string($v).'"'; 

와 동등하다$v = $this->db->quote($v);에 PDO 인스턴스가 있는지 확인합니다.$this->dbpdo 메서드를 호출할 수 있습니다.quote()

PDO에서는 mysql_real_escape_string이 필요하지 않습니다.

PDO 자체는 mysql 쿼리에서 특수 문자를 조정하며 익명 파라미터를 전달하고 실행 시간을 바인딩하기만 하면 됩니다.이와 같이 속성 이름, 이메일 및 암호가 포함된 사용자 테이블이 있고 이러한 사용 준비 문을 삽입해야 합니다. 이름을 => $name="로 전달할 수 있습니다.라제시 ";

mysql_real_sysql_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();
}

는 할 수 ). 는 ARE ACTULY를 .$dbh->quote($value)PDO를 사용할 때, 그리고 그것들은 완전히 정당한 이유일지라도...

  1. MySQL/Maria DB의 InnoDb 테이블을 이용하기 때문에 "BULK INSERT" 명령을 여러 레코드로 루프하고 있는 경우(보통 1000개의 레코드로 재시작합니다). 준비된 문을 사용하여 개별 삽입 명령을 작성하는 것은 깔끔하지만 대량 작업을 수행할 때 매우 비효율적입니다.
  2. IN수 때(...)을 사용할 수 없습니다.$dbh->quote($value)★★★★★★★★★★★★★★★★★★★!

네, ,, 렇, 렇, 그, 니,$dbh->quote($value)이 명령어를 사용할 수 있는 이유일 수 있습니다.

PS $dbh->quote($value)명령도 이 기능을 수행합니다.

나가.

하면, 이것은 에 해당하는 입니다.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, mysqli 등가물은 다음과 같습니다.

function my_real_escape_string($value, $connection) {
    return mysqli_real_escape_string($connection, $value);
}

언급URL : https://stackoverflow.com/questions/14012642/what-is-the-pdo-equivalent-of-function-mysql-real-escape-string

반응형