>  기사  >  백엔드 개발  >  addlashes()의 목적은 무엇이며 PHP에서 mysql 주입을 방지하는 방법은 무엇입니까?

addlashes()의 목적은 무엇이며 PHP에서 mysql 주입을 방지하는 방법은 무엇입니까?

WBOY
WBOY원래의
2016-08-04 09:21:111433검색

1. 양식 데이터
addlashes()의 목적은 무엇이며 PHP에서 mysql 주입을 방지하는 방법은 무엇입니까?
양식 데이터를 표시합니다

2.php에서 캡쳐한 폼 데이터
addlashes()의 목적은 무엇이며 PHP에서 mysql 주입을 방지하는 방법은 무엇입니까?
가 자동으로 추가되었습니다

3.mysql 데이터(하단)
addlashes()의 목적은 무엇이며 PHP에서 mysql 주입을 방지하는 방법은 무엇입니까?
은 mysql에 기록되지만 없음

4. mysql 소프트웨어에 의해 숨겨져 있는 것 같습니다. 명령줄을 확인하세요.
addlashes()의 목적은 무엇이며 PHP에서 mysql 주입을 방지하는 방법은 무엇입니까?
저도 못 봤어요

공식 성명에 따르면
http://www.php.net/manual/zh/function.addslashes.php

addlashes()를 사용하는 예는 데이터베이스에 데이터를 입력할 때입니다. 예를 들어 O'reilly라는 이름을 데이터베이스에 삽입하려면 해당 이름을 이스케이프해야 합니다. DBMS별 이스케이프 기능(예: MySQL의 경우 mysqli_real_escape_string(), PostgreSQL의 경우 pg_escape_string())을 사용하는 것이 좋습니다. 그러나 사용 중인 DBMS에 이스케이프 기능이 없고 특수 문자를 이스케이프하는 데 사용하는 경우에는 다음을 수행할 수 있습니다. 이 기능을 사용하세요. 데이터베이스에 데이터를 삽입하기 위해서만 추가 데이터가 삽입되지는 않습니다. PHP 지시문 Magic_quotes_sybase가 on으로 설정되면 '를 삽입하면 '으로 이스케이프된다는 의미입니다.

질문:
1. addleshes() 함수는 어떤 종류의 메커니즘을 사용하여 주입을 방지하나요?
2. 어떤 상황에서 Stripslashes()를 사용하나요?
3. 제출된 데이터를 htmlspecialchars()로 직접 이스케이프하여 데이터베이스에 저장하면 더 좋을까요?
4. SQL 삽입을 방지하는 가장 좋은 방법은 무엇인가요?

.

답글 내용:

1. 양식 데이터
addlashes()의 목적은 무엇이며 PHP에서 mysql 주입을 방지하는 방법은 무엇입니까?
양식 데이터를 표시합니다

2.php에서 캡쳐한 폼 데이터
addlashes()의 목적은 무엇이며 PHP에서 mysql 주입을 방지하는 방법은 무엇입니까?
가 자동으로 추가되었습니다

3.mysql 데이터(하단)
addlashes()의 목적은 무엇이며 PHP에서 mysql 주입을 방지하는 방법은 무엇입니까?
은 mysql에 기록되지만 없음

4. mysql 소프트웨어에 의해 숨겨져 있는 것 같습니다. 명령줄을 확인하세요.
addlashes()의 목적은 무엇이며 PHP에서 mysql 주입을 방지하는 방법은 무엇입니까?
저도 못 봤어요

공식 성명에 따르면
http://www.php.net/manual/zh/function.addslashes.php

addlashes()를 사용하는 예는 데이터베이스에 데이터를 입력할 때입니다. 예를 들어 O'reilly라는 이름을 데이터베이스에 삽입하려면 해당 이름을 이스케이프해야 합니다. DBMS별 이스케이프 기능(예: MySQL의 경우 mysqli_real_escape_string(), PostgreSQL의 경우 pg_escape_string())을 사용하는 것이 좋습니다. 그러나 사용 중인 DBMS에 이스케이프 기능이 없고 특수 문자를 이스케이프하는 데 사용하는 경우에는 다음을 수행할 수 있습니다. 이 기능을 사용하세요. 단지 데이터베이스에 데이터를 삽입하기 위해 추가 데이터가 삽입되지는 않습니다. PHP 지시문 Magic_quotes_sybase가 on으로 설정되면 '를 삽입하면 '으로 이스케이프된다는 의미입니다.

질문:
1. addleshes() 함수는 어떤 종류의 메커니즘을 사용하여 주입을 방지하나요?
2. 어떤 상황에서 Stripslashes()를 사용하나요?
3. 제출된 데이터를 htmlspecialchars()로 직접 이스케이프하여 데이터베이스에 저장하면 더 좋을까요?
4. SQL 삽입을 방지하는 가장 좋은 방법은 무엇인가요?

.

문서에 적힌 대로 addslashes는 매개변수 따옴표 앞에 슬래시만 추가하면 됩니다.
인쇄한 데이터와 마찬가지로 매개변수 앞에 슬래시가 있습니다.
하지만 데이터베이스에는 슬래시가 있어서는 안 됩니다!
addslashes 주입을 방지하는 방법은 SQL 작성 시 입력 매개변수가 직접 적용되는 것을 방지하여 주입을 방지할 수 있는 SQL을 생성하는 것입니다.
예를 들어 $sql = "SELECT * FROM user WHERE id = '$id'";, 여기서 $id 매개변수를 고의로 1' OR '1 = 1'에 조작한다면 SQL의 인젝션이 되지 않을까요?
그리고 슬래시와 함께 addslashes을 사용하면 $id 안의 따옴표가 번역되어 잘못된 SQL이 생성되지 않습니다. 그러나 이러한 결과는 데이터 쓰기에 영향을 미치지 않습니다. 왜냐하면 데이터가 실제로 삽입되고 업데이트될 때 이러한 슬래시가 다시 변환되기 때문입니다.

SQL 주입 방지(입력 데이터베이스):
PDO bindParam 또는 mysqli_stmt_bind_param: SQL 주입을 방지합니다.
슬래시 추가: 백슬래시를 사용하여 SQL을 방지하기 위해 모든 작은따옴표, 큰따옴표, 백슬래시 및 NUL을 어느 정도 이스케이프합니다. 주입.
mysqli_real_escape_string: SQL 문에서 특수 문자를 이스케이프합니다.
bind_param을 사용하면 addlashes, mysqli_real_escape_string, Magic_quotes_gpc를 사용할 필요가 없습니다.
예:

<code>PDO MySQL:
//方法1(问号占位符)
$stmt = $db->prepare('UPDATE posts SET post_title = ?, post_content = ? WHERE id = ?');
$stmt->execute(array($title,$content,$id)); //所有值视作PDO::PARAM_STR处理

//方法2(命名占位符)
$stmt = $db->prepare('UPDATE posts SET post_title = :title, post_content = :content WHERE id = :id');
$stmt->execute(array(':title' => $title,':content' => $content,':id' => $id)); //所有值视作PDO::PARAM_STR处理

//方法3
$stmt = $db->prepare('UPDATE posts SET post_title = ?, post_content = ? WHERE id = ?');
$stmt->bindParam(1, $title,   PDO::PARAM_STR);
$stmt->bindParam(2, $content, PDO::PARAM_STR);
$stmt->bindParam(3, $id,      PDO::PARAM_INT);
$stmt->execute();

//方法4
$stmt = $db->prepare('UPDATE posts SET post_title = :title, post_content = :content WHERE id = :id');
$stmt->bindParam(':title',   $title,   PDO::PARAM_STR);
$stmt->bindParam(':content', $content, PDO::PARAM_STR);
$stmt->bindParam(':id',      $id,      PDO::PARAM_INT);
$stmt->execute();

MySQLi:
//MySQLi只需执行一次bind_param,要比PDO简洁一些,MySQLi不支持命名占位符.
$stmt->bind_param('ssi', $title, $content, $id);</code>

당신이 언급한 htmlspecialchars는 HTML 출력 시 XSS 공격을 방어하기 위한 것으로 위에서 언급한 SQL 삽입에 대한 방어와 다릅니다.

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