SQL 주입을 피하기 위해 PDO를 사용하여 mysql을 쿼리하는 방법
기존의 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('fdipzone','123456')")){ 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('mysql:dbname=mydb;host=127.0.0.1;charset=utf8', 'root', 'pass'); $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 'utf8'"); $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 = '1,2,3,4,5,6'; 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中文网。
相关推荐:
关于HTML5 localStorage and sessionStorage 之间的区别
위 내용은 SQL 주입을 피하기 위해 PDO를 사용하여 mysql을 쿼리하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

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

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

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

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

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

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

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

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

뜨거운 주제











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

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

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

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

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

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

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

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