백엔드 개발 PHP 튜토리얼 PHP에서 SQL 삽입을 방지하기 위해 더 이상 addlashes 및 mysql_real_escape_string을 사용하지 마세요.

PHP에서 SQL 삽입을 방지하기 위해 더 이상 addlashes 및 mysql_real_escape_string을 사용하지 마세요.

Aug 08, 2016 am 09:30 AM
name pdo stmt string

이 블로거는 다양한 인터넷 기술에 관심이 많으며 장황하고 강박 장애를 동반하는 경우가 많습니다. 기사가 도움이 된다고 생각하시면 저를 팔로우하세요. 재인쇄할 때 "Dark Blue Scythe"를 표시해 주십시오.


SQL 삽입을 방지하기 위해 여전히 addlashes 및 str_replace를 사용하는 많은 PHP 웹사이트를 보았습니다. 다음에서 확인해 보세요. Baidu." PHP anti-injection"도 이를 사용하고 있습니다. 실제로는 mysql_real_escape_string에도 해커가 이를 우회할 수 있는 방법이 있는 것으로 나타났습니다. 세 가지 방법 , 그렇다면 내 블로그 게시물은 모든 후발자들에게 이 구덩이를 우회하도록 상기시키는 데 의미가 있을 것입니다.

굴을 파는 것이 아닌 미래 세대를 위해 나무를 심는다는 생각으로 PHP, MYSQL 버전을 제공합니다. 앞으로는 "문제"가 더 이상 "문제"가 되지 않도록 정보를 제공합니다.

str_replace 및 다양한 PHP 문자 교체 기능을 사용하면 이런 "검은색"이 발생하는 것은 말할 필요도 없습니다. "목록" 방어는 시간의 시험을 견디지 못하는 것으로 입증되었습니다.

다음은 addlasher와 mysql_real_escape_string을 우회하는 방법이다( 트릭ck).


참고: 트릭은 MYSQL5.5.37-log에서 수정되었지만 여전히 주입 문제에 대한 확실한 해결책은 없습니다. 많은 회사의 시스템이 여전히 Mysql5.0을 사용하고 있으므로 즉시 개선할 것을 제안합니다. 이것이 바로 제가 "프로그래머들이 자신의 능력을 빠르게 향상시킬 수 있는 여러 가지 방법에 대해 이야기하는" 이유이기도 합니다. "에서 언급 된 매우 중요한 사항입니다.

참고: 귀하의 시스템이 SQL 주입 위험이 있는지 확실하지 않은 경우, 다음 DEMO를 서버에 배포하십시오. 실행 결과가 동일하다면 최종 완벽한 솔루션을 참조하십시오.

MYSQL:

mysql> select version();
+---------------------+
| version()           |
+---------------------+
| 5.0.45-community-ny |
+---------------------+
1 row in set (0.00 sec)
mysql> create database test default charset GBK;
Query OK, 1 row affected (0.00 sec)
mysql> use test;
Database changed
mysql> CREATE TABLE users (
    username VARCHAR(32) CHARACTER SET GBK,
    password VARCHAR(32) CHARACTER SET GBK,
    PRIMARY KEY (username)
);
Query OK, 0 rows affected (0.02 sec)
mysql> insert into users SET username='ewrfg', password='wer44';
Query OK, 1 row affected (0.01 sec)
mysql> insert into users SET username='ewrfg2', password='wer443';
Query OK, 1 row affected (0.01 sec)
mysql> insert into users SET username='ewrfg4', password='wer4434';
Query OK, 1 row affected (0.01 sec)=
로그인 후 복사

PHP:

<?php
echo "PHP version: ".PHP_VERSION."\n";

mysql_connect(&#39;servername&#39;,&#39;username&#39;,&#39;password&#39;);
mysql_select_db("test");
mysql_query("SET NAMES GBK");

$_POST[&#39;username&#39;] = chr(0xbf).chr(0x27).&#39; OR username = username /*&#39;;
$_POST[&#39;password&#39;] = &#39;guess&#39;;

$username = addslashes($_POST[&#39;username&#39;]);
$password = addslashes($_POST[&#39;password&#39;]);
$sql = "SELECT * FROM  users WHERE  username = &#39;$username&#39; AND password = &#39;$password&#39;";
$result = mysql_query($sql) or trigger_error(mysql_error().$sql);

var_dump(mysql_num_rows($result));
var_dump(mysql_client_encoding());

$username = mysql_real_escape_string($_POST[&#39;username&#39;]);
$password = mysql_real_escape_string($_POST[&#39;password&#39;]);
$sql = "SELECT * FROM  users WHERE  username = &#39;$username&#39; AND password = &#39;$password&#39;";
$result = mysql_query($sql) or trigger_error(mysql_error().$sql);

var_dump(mysql_num_rows($result));
var_dump(mysql_client_encoding());

mysql_set_charset("GBK");
$username = mysql_real_escape_string($_POST[&#39;username&#39;]);
$password = mysql_real_escape_string($_POST[&#39;password&#39;]);
$sql = "SELECT * FROM  users WHERE  username = &#39;$username&#39; AND password = &#39;$password&#39;";
$result = mysql_query($sql) or trigger_error(mysql_error().$sql);

var_dump(mysql_num_rows($result));
var_dump(mysql_client_encoding());
로그인 후 복사

결과:
PHP version: 5.2.5
int(3)
string(6) "latin1"
int(3)
string(6) "latin1"
int(0)
string(3) "gbk" 
로그인 후 복사
할 수 있습니다. 보세요 addlashes를 사용하든 mysql_real_escape_string을 사용하든 코딩 취약점을 악용하여 비밀번호를 입력하여 서버에 로그인할 수 있는 주입 공격을 수행할 수 있습니다! ! ! ! (공격 원리에 대해서는 자세히 설명하지 않겠습니다. 관심 있는 학생들은 문자 인코딩의 단일 바이트 및 다중 바이트 문제를 공부할 수 있습니다.)

참고: 세 번째 mysql_real_escape_string이 주입을 방지할 수 있는 이유는 mysql_escape_string 자체가 현재 인코딩을 결정할 수 없기 때문입니다. 이를 추가하면 인코딩 주입을 방지할 수 있습니다. 문제. SQL 주입은 어느 정도 방지할 수 있지만, 여전히 다음과 같은 완벽한 솔루션을 권장합니다.

완벽한 해결책은 PDO 및 MYSQLi를 준비된 문 메커니즘과 함께 사용하여 mysql_query를 대체하는 것입니다(참고: mysql_query는 PHP 5.5.0부터 더 이상 사용되지 않으며 향후 이동될 예정입니다). 제외):

PDO:

$pdo = new PDO(&#39;mysql:dbname=dbtest;host=127.0.0.1;charset=utf8&#39;, &#39;user&#39;, &#39;pass&#39;);

$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');
$stmt->execute(array('name' => $name));

foreach ($stmt as $row) {
    // do something with $row
}
로그인 후 복사

MYSQLi:

$stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?');
$stmt->bind_param('s', $name);

$stmt->execute();

$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
    // do something with $row
}
로그인 후 복사

위 내용은 PHP에서 SQL 삽입을 방지하는 방법을 소개합니다. 더 이상 addlashes 및 mysql_real_escape_string을 사용하지 마세요. 관련 내용이 포함되어 있어 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. 아무도들을 수없는 경우 오디오를 수정하는 방법
1 몇 달 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 채팅 명령 및 사용 방법
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

Jul 24, 2023 pm 07:55 PM

Java의 String.valueOf() 함수를 사용하여 기본 데이터 유형을 문자열로 변환 Java 개발에서 기본 데이터 유형을 문자열로 변환해야 할 때 일반적인 방법은 String 클래스의 valueOf() 함수를 사용하는 것입니다. 이 함수는 기본 데이터 유형의 매개변수를 허용하고 해당 문자열 표현을 반환할 수 있습니다. 이 기사에서는 기본 데이터 유형 변환을 위해 String.valueOf() 함수를 사용하는 방법을 살펴보고 다음과 같은 몇 가지 코드 예제를 제공합니다.

char 배열을 문자열로 변환하는 방법 char 배열을 문자열로 변환하는 방법 Jun 09, 2023 am 10:04 AM

char 배열을 문자열로 변환하는 방법: 할당을 통해 달성할 수 있습니다. char 배열이 문자열에 직접 값을 할당하고 실행하도록 하려면 {char a[]=" abc d\0efg ";string s=a;} 구문을 사용합니다. 변환을 완료하는 코드입니다.

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

Java의 String.replace() 함수를 사용하여 문자열의 문자(문자열)를 바꿉니다. Java의 String.replace() 함수를 사용하여 문자열의 문자(문자열)를 바꿉니다. Jul 25, 2023 pm 05:16 PM

Java의 String.replace() 함수를 사용하여 문자열의 문자(문자열) 바꾸기 Java에서 문자열은 불변 객체입니다. 즉, 문자열 객체가 생성되면 해당 값을 수정할 수 없습니다. 그러나 문자열에서 특정 문자나 문자열을 바꿔야 하는 상황이 발생할 수 있습니다. 이때 Java의 String 클래스에 있는 replacement() 메소드를 사용하여 문자열 교체를 구현할 수 있습니다. String 클래스의 replacement() 메소드에는 두 가지 유형이 있습니다.

프로그래밍에서 $stmt PHP의 중요성과 실용적인 방법 프로그래밍에서 $stmt PHP의 중요성과 실용적인 방법 Feb 27, 2024 pm 02:00 PM

프로그래밍에서 $stmtPHP의 중요성과 실용적인 방법 PHP 프로그래밍 과정에서 $stmt 객체를 사용하여 준비된 명령문(PreparedStatement)을 실행하는 것은 매우 귀중한 기술입니다. 이 기술은 프로그램의 보안을 향상시킬 수 있을 뿐만 아니라 SQL 주입 공격을 효과적으로 방지하고 데이터베이스 운영을 보다 효율적으로 만들 수 있습니다. 준비된 문 프로그래밍에서 $stmtPHP의 중요성은 SQL 문을 실행하기 전에 두 부분으로 나누는 것을 의미합니다. SQ

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

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

See all articles