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->db
pdo 메서드를 호출할 수 있습니다.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를 사용할 때, 그리고 그것들은 완전히 정당한 이유일지라도...
- MySQL/Maria DB의 InnoDb 테이블을 이용하기 때문에 "BULK INSERT" 명령을 여러 레코드로 루프하고 있는 경우(보통 1000개의 레코드로 재시작합니다). 준비된 문을 사용하여 개별 삽입 명령을 작성하는 것은 깔끔하지만 대량 작업을 수행할 때 매우 비효율적입니다.
- 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
'source' 카테고리의 다른 글
MySQL: localhost에는 접속할 수 있지만 127.0.0.1에는 접속할 수 없습니다. (0) | 2022.11.18 |
---|---|
JavaScript에서 문자열을 대체하여 '9.61'을 '9:61'로 변환하려면 어떻게 해야 합니까? (0) | 2022.11.18 |
Kubernetes 클러스터 내에서 호스트 이름으로 MariaDB에 연결할 수 없음 (0) | 2022.11.08 |
WELD-000072 수동화 범위를 선언하는 관리 빈은 수동화가 가능해야 합니다. (0) | 2022.11.08 |
MYSQL에서 모든 테이블과 필드를 utf-8-bin 대조로 변경하는 스크립트 (0) | 2022.11.08 |