데이터 베이스 MySQL 튜토리얼 SQL 주입을 피하기 위해 PDO를 사용하여 mysql을 쿼리하는 방법

SQL 주입을 피하기 위해 PDO를 사용하여 mysql을 쿼리하는 방법

Jun 09, 2018 pm 02:03 PM
pdo SQL 주입

기존의 mysql_connect 및 mysql_query 메소드를 사용하여 데이터베이스에 연결하고 쿼리할 때 필터링이 엄격하지 않으면 SQL 주입의 위험이 있습니다. mysql_real_escape_string() 함수를 사용하여 사용자가 제출한 값을 필터링할 수 있지만 여기에도 결함이 있습니다. PHP PDO 확장의 prepare 메소드를 사용하면 SQL 인젝션의 위험을 피할 수 있습니다.

PDO(PHP 데이터 개체)는 PHP5에 추가된 새로운 주요 기능입니다. 왜냐하면 PHP 5 이전에는 php4/php3에 php_mysql.dll과 같은 다양한 데이터베이스를 연결하고 처리하기 위한 많은 데이터베이스 확장이 있었기 때문입니다. PHP6은 기본적으로 PDO를 사용하여 연결하며 mysql 확장은 보조로 사용됩니다. 공식 주소: http://php.net/manual/en/book.pdo.php

1. PDO 구성

PDO 확장을 사용하기 전에 먼저 PHP에서 이 확장을 활성화해야 합니다. ini에서 "extension=php_pdo.dll" 앞의 ";" 숫자를 제거해야 합니다. 데이터베이스에 연결하려면 PDO 관련 데이터베이스 확장자(보통 php_pdo_mysql) 앞의 ";" 숫자도 제거해야 합니다. .dll이 사용됨), Apache 서버를 다시 시작할 수 있습니다.

extension=php_pdo.dll 
extension=php_pdo_mysql.dll
로그인 후 복사

2. PDO는 mysql 데이터베이스에 연결됩니다

$dbh = new PDO("mysql:host=localhost;dbname=mydb","root","password");
로그인 후 복사

기본값은 긴 연결이 아닙니다. 데이터베이스에 대한 긴 연결을 사용하려는 경우 끝에 다음 매개변수를 추가할 수 있습니다.

3. PDO 설정 속성

PDO에는 세 가지 오류 처리 방법이 있습니다.

PDO::ERrmODE_SILENT는 오류 메시지를 표시하지 않고 오류 코드만 설정합니다

PDO::ERrmODE_WARNING은 경고 오류를 표시합니다

PDO::ERrmODE_EXCEPTION에서 예외가 발생함

다음 명령문을 사용하여 예외를 발생시키는 오류 처리 방법을 설정할 수 있습니다.

$dbh = new PDO("mysql:host=localhost;dbname=mydb","root","password","array(PDO::ATTR_PERSISTENT => true) "); 
$dbh = null; //(释放)
로그인 후 복사

서로 다른 데이터베이스는 반환된 필드 이름의 대소문자를 다르게 처리하므로 PDO는 PDO를 제공합니다. ::ATTR_CASE 설정 항목(PDO::CASE_LOWER, PDO ::CASE_NATURAL, PDO::CASE_UPPER 포함)은 반환된 필드 이름의 대소문자를 결정합니다.

PDO::ATTR_ORACLE_NULLS 유형(PDO::NULL_NATURAL, PDO::NULL_EmpTY_STRING, PDO::NULL_TO_STRING 포함)을 설정하여 데이터베이스에서 반환된 NULL 값의 PHP에서 해당 값을 지정합니다.

4. 일반적인 PDO 메서드 및 해당 응용

PDO::query()는 주로 기록된 결과를 반환하는 작업, 특히 SELECT 작업에 사용됩니다.

PDO::exec() 입니다. INSERT, UPDATE 및 기타 작업과 같이 결과 집합을 반환하지 않는 작업의 경우

PDO::prepare()는 주로 전처리 작업을 실행하기 위해 $rs->execute()를 사용해야 합니다. 전처리의 SQL 문입니다. 이 메서드는 매개 변수를 바인딩할 수 있으며 매우 강력합니다(SQL 주입 방지는 이에 따라 다름).

PDO::lastInsertId()는 마지막 삽입 작업을 반환하고 기본 키 열 유형은 마지막 자동 증가입니다. ID

PDOStatement::fetch()는 레코드를 가져오는 데 사용됩니다.

PDOStatement::fetchAll()은 모든 레코드를 컬렉션으로 가져오는 데 사용됩니다.

PDOStatement::fetchColumn()은 레코드를 가져오는 데 사용됩니다. 결과 필드에 지정된 첫 번째 레코드, 기본값은 첫 번째 필드입니다.

PDOStatement::rowCount(): 주로 PDO::query() 및 PDO의 DELETE, INSERT 및 UPDATE 작업의 영향을 받는 결과 세트에 사용됩니다. ::prepare(). PDO::exec() 메서드 및 SELECT 작업에는 유효하지 않습니다.


5.PDO 작업 MYSQL 데이터베이스 인스턴스

$db->setAttribute(PDO::ATTR_ERrmODE, PDO::ERrmODE_EXCEPTION);
로그인 후 복사
<?php 
$pdo = new PDO("mysql:host=localhost;dbname=mydb","root",""); 
if($pdo -> exec("insert into mytable(name,content) values(&#39;fdipzone&#39;,&#39;123456&#39;)")){ 
echo "insert success"; 
echo $pdo -> lastinsertid(); 
} 
?>
로그인 후 복사
<?php 
$pdo = new PDO("mysql:host=localhost;dbname=mydb","root",""); 
$rs = $pdo -> query("select * from table"); 
$rs->setFetchMode(PDO::FETCH_ASSOC); //关联数组形式
//$rs->setFetchMode(PDO::FETCH_NUM); //数字索引数组形式
while($row = $rs -> fetch()){ 
    print_r($row); 
} 
?>
로그인 후 복사

데이터 행 수 계산:

<?php
foreach( $db->query( "SELECT * FROM table" ) as $row )
{
    print_r( $row );
}
?>
로그인 후 복사

prepare 방법:

<?php
$sql="select count(*) from table";
$num = $dbh->query($sql)->fetchColumn();
?>
로그인 후 복사

prepare 쿼리:

<?php
$query = $dbh->prepare("select * from table");
if ($query->execute()) {
    while ($row = $query->fetch()) {
        print_r($row);
    }
}
?>
로그인 후 복사

PDO 사용 MySQL 데이터베이스에 액세스할 때 실제 준비된 명령문은 기본적으로 사용되지 않습니다. 이 문제를 해결하려면 준비된 문의 에뮬레이션 효과를 비활성화해야 합니다. 다음은 PDO를 사용하여 링크를 만드는 예입니다:

<?php
$dbh = new PDO(&#39;mysql:dbname=mydb;host=127.0.0.1;charset=utf8&#39;, &#39;root&#39;, &#39;pass&#39;);
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
?>
로그인 후 복사

setAttribute()这一行是强制性的,它会告诉 PDO 禁用模拟预处理语句,并使用 real parepared statements 。这可以确保SQL语句和相应的值在传递到mysql服务器之前是不会被PHP解析的(禁止了所有可能的恶意SQL注入攻击)。

虽然你可以配置文件中设置字符集的属性(charset=utf8),但是需要格外注意的是,老版本的 PHP( < 5.3.6)在DSN中是忽略字符参数的。

完整的代码使用实例:

<?php
$dbh = new PDO("mysql:host=localhost; dbname=mydb", "root", "pass");
$dbh->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); //禁用prepared statements的仿真效果
$dbh->exec("set names &#39;utf8&#39;"); 
$sql="select * from table where username = ? and password = ?";
$query = $dbh->prepare($sql); 
$exeres = $query->execute(array($username, $pass)); 
if ($exeres) { 
    while ($row = $query->fetch(PDO::FETCH_ASSOC)) {
        print_r($row);
    }
}
$dbh = null;
?>
로그인 후 복사

上面这段代码就可以防范sql注入。为什么呢?

当调用 prepare() 时,查询语句已经发送给了数据库服务器,此时只有占位符 ? 发送过去,没有用户提交的数据;当调用到 execute()时,用户提交过来的值才会传送给数据库,它们是分开传送的,两者独立的,SQL攻击者没有一点机会。

但是我们需要注意的是以下几种情况,PDO并不能帮助你防范SQL注入。

不能让占位符 ? 代替一组值,这样只会获取到这组数据的第一个值,如:

select * from table where userid in ( ? );
로그인 후 복사

如果要用in來查找,可以改用find_in_set()实现

$ids = &#39;1,2,3,4,5,6&#39;;
select * from table where find_in_set(userid, ?);
로그인 후 복사

不能让占位符代替数据表名或列名,如:

select * from table order by ?;
로그인 후 복사

不能让占位符 ? 代替任何其他SQL语法,如:

select extract( ? from addtime) as mytime from table;
로그인 후 복사

本篇文章如何使用PDO查询mysql避免SQL注入的方法,更多相关内容请关注php中文网。

相关推荐:

关于php 双向队列类的讲解

php heredoc 与 nowdoc之间的区别与特点

关于HTML5 localStorage and sessionStorage 之间的区别

위 내용은 SQL 주입을 피하기 위해 PDO를 사용하여 mysql을 쿼리하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
4 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

PHP 치명적인 오류에 대한 해결 방법: 정의되지 않은 메소드 PDO::prepare() 호출 PHP 치명적인 오류에 대한 해결 방법: 정의되지 않은 메소드 PDO::prepare() 호출 Jun 22, 2023 pm 06:40 PM

PHP는 오랫동안 사용되어 온 인기 있는 웹 개발 언어입니다. PHP에 통합된 PDO(PHP 데이터 개체) 클래스는 웹 애플리케이션 개발 중에 데이터베이스와 상호 작용하는 일반적인 방법입니다. 그러나 일부 PHP 개발자가 자주 직면하는 문제는 PDO 클래스를 사용하여 데이터베이스와 상호 작용할 때 다음과 같은 오류가 발생한다는 것입니다. PHPFatalerror:CalltoundefinemethodPDO::prep

PHP 및 PDO: 대량 삽입 및 업데이트를 수행하는 방법 PHP 및 PDO: 대량 삽입 및 업데이트를 수행하는 방법 Jul 28, 2023 pm 07:41 PM

PHP 및 PDO: 일괄 삽입 및 업데이트를 수행하는 방법 소개: PHP를 사용하여 데이터베이스 관련 애플리케이션을 작성할 때 데이터를 일괄 삽입하고 업데이트해야 하는 상황에 자주 직면하게 됩니다. 전통적인 접근 방식은 루프를 사용하여 여러 데이터베이스 작업을 수행하는 것이지만 이 방법은 비효율적입니다. PHP의 PDO(PHPDataObject)는 일괄 삽입 및 업데이트 작업을 수행하는 보다 효율적인 방법을 제공합니다. 이 기사에서는 PDO를 사용하여 일괄 삽입 및 업데이트 작업을 구현하는 방법을 소개합니다. 1. PDO 소개: PDO는 PH입니다.

PHP PDO 대 mysqli: 비교 및 ​​대조 PHP PDO 대 mysqli: 비교 및 ​​대조 Feb 19, 2024 pm 12:24 PM

PDOPDO는 PHP용 통합 인터페이스를 제공하는 객체 지향 데이터베이스 액세스 추상화 계층으로, 동일한 코드를 사용하여 다양한 데이터베이스(예: Mysql, postgresql, oracle)와 상호 작용할 수 있습니다. PDO는 기본 데이터베이스 연결의 복잡성을 숨기고 데이터베이스 작업을 단순화합니다. 장점과 단점 장점: 통합 인터페이스, 다중 데이터베이스 지원, 데이터베이스 작업 단순화, 개발 어려움 감소, 준비된 명령문 제공, 보안 향상, 트랜잭션 처리 지원 단점: 성능이 기본 확장보다 약간 낮을 수 있고, 외부 라이브러리에 의존하며, 오버헤드가 증가할 수 있습니다. 데모 코드는 PDO를 사용하여 mysql 데이터베이스에 연결합니다: $db=newPDO("mysql:host=localhost;dbnam

PHP 및 PDO: 데이터베이스에서 JSON 데이터를 처리하는 방법 PHP 및 PDO: 데이터베이스에서 JSON 데이터를 처리하는 방법 Jul 29, 2023 pm 05:17 PM

PHP 및 PDO: 데이터베이스에서 JSON 데이터를 처리하는 방법 현대 웹 개발에서 대량의 데이터를 처리하고 저장하는 것은 매우 중요한 작업입니다. 모바일 애플리케이션과 클라우드 컴퓨팅의 인기로 인해 점점 더 많은 데이터가 JSON(JavaScript Object Notation) 형식으로 데이터베이스에 저장됩니다. 일반적으로 사용되는 서버측 언어인 PHP의 PDO(PHPDataObject) 확장은 데이터베이스를 처리하고 운영하는 편리한 방법을 제공합니다. 책

Nginx 기본 보안 지식: SQL 주입 공격 방지 Nginx 기본 보안 지식: SQL 주입 공격 방지 Jun 10, 2023 pm 12:31 PM

Nginx는 빠르고 고성능이며 확장 가능한 웹 서버이며, Nginx의 보안은 웹 애플리케이션 개발에서 무시할 수 없는 문제입니다. 특히 웹 애플리케이션에 큰 피해를 줄 수 있는 SQL 주입 공격이 있습니다. 이 기사에서는 Nginx를 사용하여 SQL 주입 공격을 방지하여 웹 애플리케이션의 보안을 보호하는 방법에 대해 설명합니다. SQL 주입 공격이란 무엇입니까? SQL 인젝션 공격은 웹 애플리케이션의 취약점을 이용하는 공격 방법이다. 공격자는 웹 애플리케이션에 악성 코드를 삽입할 수 있습니다.

PHP 및 PDO: 페이징 쿼리를 수행하고 데이터를 표시하는 방법 PHP 및 PDO: 페이징 쿼리를 수행하고 데이터를 표시하는 방법 Jul 29, 2023 pm 04:10 PM

PHP 및 PDO: 페이지에서 데이터를 쿼리하고 표시하는 방법 웹 애플리케이션을 개발할 때 페이지에서 데이터를 쿼리하고 표시하는 것은 매우 일반적인 요구 사항입니다. 페이징을 통해 한 번에 일정량의 데이터를 표시할 수 있어 페이지 로딩 속도와 사용자 경험이 향상됩니다. PHP에서는 PDO(PHP Data Object) 라이브러리를 사용하여 페이징 쿼리 및 데이터 표시 기능을 쉽게 구현할 수 있습니다. 이 기사에서는 PHP에서 PDO를 사용하여 페이지별로 데이터를 쿼리하고 표시하는 방법을 소개하고 해당 코드 예제를 제공합니다. 1. 데이터베이스 및 데이터 테이블 생성

PHP 및 PDO: 데이터베이스에서 전체 텍스트 검색을 수행하는 방법 PHP 및 PDO: 데이터베이스에서 전체 텍스트 검색을 수행하는 방법 Jul 30, 2023 pm 04:33 PM

PHP 및 PDO: 데이터베이스에서 전체 텍스트 검색을 수행하는 방법 최신 웹 애플리케이션에서 데이터베이스는 매우 중요한 구성 요소입니다. 전체 텍스트 검색은 대량의 데이터에서 특정 정보를 검색해야 할 때 매우 유용한 기능입니다. PHP 및 PDO(PHPDataObjects)는 데이터베이스에서 전체 텍스트 검색을 수행하는 간단하면서도 강력한 방법을 제공합니다. 이 기사에서는 PHP와 PDO를 사용하여 전체 텍스트 검색을 구현하는 방법을 소개하고 프로세스를 시연하는 몇 가지 샘플 코드를 제공합니다. 첫 번째

PDO를 사용하여 Redis 데이터베이스에 연결하는 방법 PDO를 사용하여 Redis 데이터베이스에 연결하는 방법 Jul 28, 2023 pm 04:29 PM

PDO를 사용하여 Redis 데이터베이스에 연결하는 방법 Redis는 캐시, 대기열 및 기타 시나리오에서 일반적으로 사용되는 고성능 오픈 소스 인메모리 스토리지 키-값 데이터베이스입니다. PHP 개발에서 Redis를 사용하면 애플리케이션의 성능과 안정성을 효과적으로 향상시킬 수 있습니다. PDO(PHPDataObjects) 확장을 통해 Redis 데이터베이스를 보다 편리하게 연결하고 운영할 수 있습니다. 이 문서에서는 코드 예제와 함께 PDO를 사용하여 Redis 데이터베이스에 연결하는 방법을 설명합니다. 처음에 Redis 확장을 설치하십시오.

See all articles