php教程 php手册 最实用有效的PHP中防止SQL注入

最实用有效的PHP中防止SQL注入

Jun 02, 2016 am 09:13 AM
foreach 문자 처리

SQL注入攻击的概念及危害我相信大家都有所了解,如果不了解的请自己度娘,下面我们来学习一下在php中如何有效的防止

问题描述:

如果用户输入的数据在未经处理的情况下插入到一条SQL查询语句,那么应用将很可能遭受到SQL注入攻击,正如下面的例子:

$unsafe_variable = $_POST['user_input']; 

mysql_query("INSERT INTO `table` (`column`) VALUES ('" . $unsafe_variable . "')");

因为用户的输入可能是这样的:

value'); DROP TABLE table;--

那么SQL查询将变成如下:

INSERT INTO `table` (`column`) VALUES('value'); DROP TABLE table;--')

应该采取哪些有效的方法来防止SQL注入?

最佳回答(来自Theo):

使用预处理语句和参数化查询。预处理语句和参数分别发送到数据库服务器进行解析,参数将会被当作普通字符处理。这种方式使得攻击者无法注入恶意的SQL。 你有两种选择来实现该方法:

1、使用PDO:

$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');
$stmt->execute(array('name' => $name));
foreach ($stmt as $row) {
    // do something with $row
}
로그인 후 복사

2、使用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
}
로그인 후 복사

PDO

注意,在默认情况使用PDO并没有让MySQL数据库执行真正的预处理语句(原因见下文)。为了解决这个问题,你应该禁止PDO模拟预处理语句。一个正确使用PDO创建数据库连接的例子如下:

$dbConnection = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'pass');
$dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
로그인 후 복사

在上面的例子中,报错模式(ATTR_ERRMODE)并不是必须的,但建议加上它。这样,当发生致命错误(Fatal Error)时,脚本就不会停止运行,而是给了程序员一个捕获PDOExceptions的机会,以便对错误进行妥善处理。 然而,第一个setAttribute()调用是必须的,它禁止PDO模拟预处理语句,而使用真正的预处理语句,即有MySQL执行预处理语句。这能确保语句和参数在发送给MySQL之前没有被PHP处理过,这将使得攻击者无法注入恶意SQL。了解原因,可参考这篇博文:PDO防注入原理分析以及使用PDO的注意事项。 注意在老版本的PHP(<5.3.6),你无法通过在PDO的构造器的DSN上设置字符集,参考:silently ignored the charset parameter。

解析

当你将SQL语句发送给数据库服务器进行预处理和解析时发生了什么?通过指定占位符(一个?或者一个上面例子中命名的 :name),告诉数据库引擎你想在哪里进行过滤。当你调用execute的时候,预处理语句将会与你指定的参数值结合。 关键点就在这里:参数的值是和经过解析的SQL语句结合到一起,而不是SQL字符串。SQL注入是通过触发脚本在构造SQL语句时包含恶意的字符串。所以,通过将SQL语句和参数分开,你防止了SQL注入的风险。任何你发送的参数的值都将被当作普通字符串,而不会被数据库服务器解析。回到上面的例子,如果$name变量的值为 ’Sarah’; DELETE FROM employees ,那么实际的查询将是在 employees 中查找 name 字段值为 ’Sarah’; DELETE FROM employees 的记录。 另一个使用预处理语句的好处是:如果你在同一次数据库连接会话中执行同样的语句许多次,它将只被解析一次,这可以提升一点执行速度。 如果你想问插入该如何做,请看下面这个例子(使用PDO):

$preparedStatement = $db->prepare(&#39;INSERT INTO table (column) VALUES (:column)&#39;);
$preparedStatement->execute(array(&#39;column&#39; => $unsafeValue));
로그인 후 복사


본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 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를 무료로 생성하십시오.

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

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

SublimeText3 중국어 버전

SublimeText3 중국어 버전

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

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

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

Java ArrayList를 순회할 때 요소를 삭제하기 위해 foreach와 iterator를 사용하는 것의 차이점은 무엇입니까? Java ArrayList를 순회할 때 요소를 삭제하기 위해 foreach와 iterator를 사용하는 것의 차이점은 무엇입니까? Apr 27, 2023 pm 03:40 PM

1. Iterator와 foreach의 차이점은 다형성 차이입니다(foreach의 맨 아래 레이어는 Iterator입니다). Iterator는 인터페이스 유형이므로 컬렉션 유형이나 배열에 관심이 없습니다. for와 foreach 모두 컬렉션 유형을 알아야 합니다. 1. foreach의 최하위 레이어가 Iterator에 의해 작성된 코드라고 말하는 이유: 디컴파일된 코드: 2. foreach와 iterator에서 제거의 차이점을 살펴보세요. Alibaba Java Development Manual, 그러나 1번의 경우에는 오류가 보고되지 않으며, 2번의 경우(java.util.ConcurrentModificationException) 먼저 오류가 보고됩니다.

PHP에서 foreach 루프 수를 결정하는 방법 PHP에서 foreach 루프 수를 결정하는 방법 Jul 10, 2023 pm 02:18 PM

​PHP가 foreach 루프 수를 결정하는 단계: 1. "$fruits" 배열을 만듭니다. 2. 초기 값이 0인 카운터 변수 "$counter"를 만듭니다. 3. "foreach"를 사용하여 루프를 만듭니다. 배열을 통해 루프 본문의 카운터 변수 값을 늘린 다음 각 요소와 해당 인덱스를 출력합니다. 4. "foreach" 루프 외부에 카운터 변수 값을 출력하여 루프가 도달하는 요소를 확인합니다.

PHP는 키가 뒤집힌 배열을 반환합니다. PHP는 키가 뒤집힌 배열을 반환합니다. Mar 21, 2024 pm 02:10 PM

이 기사에서는 키 값을 뒤집은 후 PHP가 배열을 반환하는 방법을 자세히 설명합니다. 편집자는 이것이 매우 실용적이라고 생각하므로 이 기사를 읽고 뭔가를 얻을 수 있기를 바랍니다. PHP 키 값 뒤집기 배열 키 값 뒤집기는 배열의 키와 값을 교환하여 원래 키를 값으로, 원래 값을 키로 사용하여 새 배열을 생성하는 배열 작업입니다. 구현 방법 PHP에서는 다음 방법을 통해 배열의 키-값 뒤집기를 수행할 수 있습니다. array_flip() 함수: array_flip() 함수는 키-값 뒤집기 작업에 특별히 사용됩니다. 배열을 인수로 받고 키와 값이 교환된 새 배열을 반환합니다. $original_array=[

PHP는 배열의 현재 요소를 반환합니다. PHP는 배열의 현재 요소를 반환합니다. Mar 21, 2024 pm 12:36 PM

이 기사에서는 PHP가 반환하는 배열의 현재 요소에 대해 자세히 설명할 것입니다. 편집자는 이것이 매우 실용적이라고 생각하므로 이 기사를 읽고 뭔가를 얻을 수 있기를 바랍니다. PHP 배열의 현재 요소 가져오기 PHP는 배열의 현재 요소 가져오기를 포함하여 배열에 액세스하고 조작하기 위한 다양한 방법을 제공합니다. 다음은 일반적으로 사용되는 몇 가지 기술을 소개합니다. 1. current() 함수 current() 함수는 배열의 내부 포인터가 현재 가리키는 요소를 반환합니다. 포인터는 처음에 배열의 첫 번째 요소를 가리킵니다. 다음 구문을 사용하십시오. $currentElement=current($array);2.key() 함수 key() 함수는 현재 요소를 가리키는 배열 내부 포인터를 반환합니다.

Tomcat에서 중국어 문자 인코딩을 올바르게 처리하는 방법 Tomcat에서 중국어 문자 인코딩을 올바르게 처리하는 방법 Dec 28, 2023 pm 01:20 PM

Tomcat에서 중국어 문자 인코딩을 올바르게 처리하는 방법 웹 개발 과정에서 중국어 문자 인코딩을 처리하는 데 종종 문제가 발생합니다. 일반적으로 사용되는 JavaWeb 서버인 Tomcat에는 중국어 문자 인코딩을 다룰 때 주의해야 할 사항이 있습니다. 이 기사에서는 Tomcat에서 중국어 문자 인코딩을 올바르게 처리하는 방법을 소개하고 해당 코드 예제를 제공합니다. 1. 문자 인코딩의 이해 먼저 문자 인코딩의 개념을 이해해야 합니다. 문자 인코딩은 문자를 이진 데이터로 매핑하는 방법입니다. 흔한

forEach 함수를 사용하여 객체의 속성을 반복하는 방법은 무엇입니까? forEach 함수를 사용하여 객체의 속성을 반복하는 방법은 무엇입니까? Nov 18, 2023 pm 06:10 PM

forEach 함수를 사용하여 객체의 속성을 반복하는 방법은 무엇입니까? JavaScript에서는 객체의 속성을 탐색해야 하는 경우가 많습니다. 객체의 속성을 반복하는 간결한 방법을 사용하려면 forEach 함수가 매우 좋은 선택입니다. 이 기사에서는 forEach 함수를 사용하여 객체의 속성을 반복하는 방법과 구체적인 코드 예제를 제공하는 방법을 설명합니다. 먼저 forEach 함수의 기본적인 사용법을 살펴보겠습니다. forEach 함수는 Java입니다.

foreach와 for 루프의 차이점은 무엇입니까 foreach와 for 루프의 차이점은 무엇입니까 Jan 05, 2023 pm 04:26 PM

차이점: 1. for는 인덱스를 통해 각 데이터 요소를 반복하는 반면 forEach는 JS 기본 프로그램을 통해 배열의 데이터 요소를 반복합니다. 2. for는 break 키워드를 통해 루프 실행을 종료할 수 있지만 forEach는 그렇지 않습니다. for는 루프 변수의 값을 제어하여 루프 실행을 제어할 수 있지만 forEach는 루프 외부에서 루프 변수를 호출할 수 없지만 forEach는 루프 외부에서 루프 변수를 호출할 수 없습니다. forEach보다 높습니다.

PHP 프로그래밍 팁: 오른쪽 첫 번째 문자를 처리하는 간단한 방법 알아보기 PHP 프로그래밍 팁: 오른쪽 첫 번째 문자를 처리하는 간단한 방법 알아보기 Mar 02, 2024 am 08:09 AM

PHP 프로그래밍 팁: 오른쪽의 첫 번째 문자를 처리하는 간단한 방법을 알아보세요. PHP 프로그래밍에서는 문자열을 처리해야 하는 상황이 자주 발생합니다. 그 중 문자열 오른쪽의 첫 번째 문자를 처리하는 것은 일반적인 요구 사항입니다. 이 기사에서는 문자열 오른쪽의 첫 번째 문자 연산을 쉽게 처리하는 데 도움이 되는 간단하고 실용적인 방법을 소개합니다. 이 기술을 더 잘 익히는 데 도움이 되도록 특정 코드 예제와 결합해 보겠습니다. PHP에서는 내장된 문자열 처리 함수를 사용하여 문자열 오른쪽의 첫 번째 문자를 가져올 수 있습니다. 그 중 일반적으로 사용되는

See all articles