PHP : mysql_real_escape_string은 사용자 입력을 청소하기에 충분합니까?
PHPPHP : mysql_real_escape_string은 사용자 입력을 청소하기에 충분합니까?
mysql_real_escape_string은 대부분의 상황에서 사용자 입력을 청소하기에 충분합니까?
::편집하다::
나는 대부분 SQL 주입을 막는 것을 생각하고 있지만 궁극적으로는 mysql_real_escape_string을 적용한 후에 사용자 데이터를 신뢰할 수 있는지 또는 응용 프로그램과 데이터베이스를 전달하기 전에 데이터를 정리하는 추가 조치를 취해야 하는지를 알고 싶습니다.
HTML 문자를 정리하는 것이 중요하지만 사용자 입력을 신뢰하는 데는 필요하지 않다고 생각합니다.
티
해결법
-
==============================
1.mysql_real_escape_string은 모든 상황에서 충분하지는 않지만 확실히 좋은 친구입니다. 더 나은 해결책은 Prepared Statements를 사용하는 것입니다.
mysql_real_escape_string은 모든 상황에서 충분하지는 않지만 확실히 좋은 친구입니다. 더 나은 해결책은 Prepared Statements를 사용하는 것입니다.
//example from http://php.net/manual/en/pdo.prepared-statements.php $stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (?, ?)"); $stmt->bindParam(1, $name); $stmt->bindParam(2, $value); // insert one row $name = 'one'; $value = 1; $stmt->execute();
또한 유효하지 않은 / 의심스러운 문자를 버리는 데 사용할 수있는 HTMLPurifier를 잊지 마십시오.
...........
편집하다: 아래의 의견을 바탕으로이 링크를 게시해야합니다 (혼란을 일으키기 전에 미안 했어야 함).
mysql_real_escape_string ()과 Prepared Statements
인용 :
Chris Shiflett (보안 전문가)
-
==============================
2.귀하의 질문에 대한 대답은 아니오입니다. mysql_real_escape_string ()은 모든 사용자 입력에 적합하지 않으며 mysql_real_escape_string ()은 모든 SQL 주입을 중지하지 않습니다. addslashes ()는 PHP에서 사용하는 또 다른 인기있는 함수이며, 동일한 문제가 있습니다.
귀하의 질문에 대한 대답은 아니오입니다. mysql_real_escape_string ()은 모든 사용자 입력에 적합하지 않으며 mysql_real_escape_string ()은 모든 SQL 주입을 중지하지 않습니다. addslashes ()는 PHP에서 사용하는 또 다른 인기있는 함수이며, 동일한 문제가 있습니다.
취약한 코드 :
mysql_query("select * from user where id=".mysql_real_escape_string($_GET[id]));
작은 악용 :
http://localhost/sql_test.php?id=1 or sleep(500)
이 패치는 id 주위에 따옴표를 사용합니다 :
mysql_query("select * from user where id='".mysql_real_escape_string($_GET[id])."'");
실제로 가장 좋은 방법은 많은 사람들이 지적한 매개 변수화 된 쿼리를 사용하는 것입니다. Pdo는 잘 작동하고, adodb는 PHP에서 또 다른 인기있는 라이브러리입니다.
mysql_real_escape_string을 사용하면 SQL 주입에만 사용해야하며 그 밖의 것은 사용하지 말아야한다. 취약점은 데이터 사용 방법에 따라 크게 다릅니다. 기능별 보안 조치를 기능별로 적용해야합니다. 그리고 예, XSS는 매우 심각한 문제입니다. html 필터링은 심각한 해커가 pw3n을 사용하는 실수입니다. xss faq을 읽으십시오.
-
==============================
3.데이터베이스에, 예. 출력을 위해 적절히 이스케이프 / 인코딩 데이터를 고려하는 것이 좋습니다.
데이터베이스에, 예. 출력을 위해 적절히 이스케이프 / 인코딩 데이터를 고려하는 것이 좋습니다.
또한 입력 내용이 예상 한 것과 비교하여 유효성을 검증하는 것도 고려해야합니다.
준비된 진술 사용을 고려 했습니까? PHP는 데이터베이스와 상호 작용할 수있는 다양한 방법을 제공합니다. 대부분은 mysql_ * 함수보다 낫다.
PDO, MDB2 및 MySQL Improved를 시작해야합니다.
-
==============================
4.어떤 상황입니까?
어떤 상황입니까?
SQL 쿼리의 경우 훌륭합니다. (준비된 문장이 더 좋다 - PDO에 대해이 투표를한다.하지만 함수는 정상적으로 이스케이프 처리한다.) HTML과 같은 경우, HTML은 일을위한 도구가 아니다. 일반적인 htmlspecialchars 나 HTML Purifier와 같은보다 정밀한 도구를 사용해 보라.
편집을 처리하려면 추가 할 수있는 다른 레이어는 데이터 값입니다 (예 : 데이터베이스에 정수를 넣고 양의 정수가 필요하면 음의 정수를 넣으려고하면 사용자에게 오류를 반환하는지 확인하십시오. 데이터 무결성에 관한 한, mysql_real_escape_string은 당신이 이스케이프 (escaping) 할 때 가장 좋습니다 (그러나 prepared statement는 완전한 이스케이프를 피하는 더 깨끗한 시스템입니다).
-
==============================
5.mysql_real_escape_string ()은 SQL 삽입 공격 만 방지하는데 유용합니다. 그것은 사이트 간 스크립팅 공격을 막는 데 도움이되지 않습니다. 이를 위해서는 원래 사용자 입력에서 수집 된 데이터를 출력하기 직전에 htmlspecialchars ()를 사용해야합니다.
mysql_real_escape_string ()은 SQL 삽입 공격 만 방지하는데 유용합니다. 그것은 사이트 간 스크립팅 공격을 막는 데 도움이되지 않습니다. 이를 위해서는 원래 사용자 입력에서 수집 된 데이터를 출력하기 직전에 htmlspecialchars ()를 사용해야합니다.
-
==============================
6.두 가지 방법이 있습니다. 하나는 준비된 문장을 사용하는 것입니다 (다른 답변에서 언급했듯이). 이제는 데이터베이스 대신 두 가지 요청을 보내야하기 때문에 앱 속도가 느려집니다. 당신이 감소 된 성과로 살 수 있다면, 그것을 위해 가십시오; Prepared Statements를 사용하면 코드를 더 예쁘고 쉽게 처리 할 수 있습니다.
두 가지 방법이 있습니다. 하나는 준비된 문장을 사용하는 것입니다 (다른 답변에서 언급했듯이). 이제는 데이터베이스 대신 두 가지 요청을 보내야하기 때문에 앱 속도가 느려집니다. 당신이 감소 된 성과로 살 수 있다면, 그것을 위해 가십시오; Prepared Statements를 사용하면 코드를 더 예쁘고 쉽게 처리 할 수 있습니다.
mysql_real_escape_string을 사용하기로 결정했다면, 신뢰할 수없는 모든 문자열을 이스케이프해야합니다. 이스케이프 된 (mysql_real_escape_string) 문자열은 SQL Injection secure입니다. 모든 문자열을 벗어나지 않으면 보안되지 않습니다. 실제로 mysql_real_escape_string을 입력 유효성 검사와 결합해야합니다. 숫자를 보유 할 것으로 예상되는 변수가 실제로 숫자이고 예상 범위 내에 있는지 확인하십시오. 사용자를 신뢰하지 마십시오.
-
==============================
7."청소"에는 여러 가지 유형이 있습니다.
"청소"에는 여러 가지 유형이 있습니다.
mysql_real_escape_string은 데이터베이스 데이터로는 충분하지만 HTML 인 경우에는 브라우저가 표시 할 때 여전히 평가됩니다.
사용자 입력에서 HTML을 제거하려면 strip_tags를 사용할 수 있습니다.
준비된 구문을 바로 지원하기 때문에 정기적 인 MySQL 대신 PDO를 사용하는 것이 좋을 것입니다. 그리고 잘못된 데이터를 이스케이프 처리합니다.
-
==============================
8.두 가지 방법을 시도해 볼 수 있습니다.
두 가지 방법을 시도해 볼 수 있습니다.
function clean_input($instr) { // Note that PHP performs addslashes() on GET/POST data. // Avoid double escaping by checking the setting before doing this. if(get_magic_quotes_gpc()) { $str = stripslashes($instr); } return mysql_real_escape_string(strip_tags(trim($instr))); }
-
==============================
9.가장 좋은 방법은 Prepared Statements를 사용하는 것입니다.
가장 좋은 방법은 Prepared Statements를 사용하는 것입니다.
-
==============================
10.필자는 PHP 5.2+에 다양한 방법으로 사용자 입력을 위생 할 수있는 입력 필터 함수가 있다고 덧붙였습니다.
필자는 PHP 5.2+에 다양한 방법으로 사용자 입력을 위생 할 수있는 입력 필터 함수가 있다고 덧붙였습니다.
다음은 수동 입력뿐 아니라 [Matt Butcher의 블로그 게시물]이 훌륭한 이유입니다.
from https://stackoverflow.com/questions/2353666/php-is-mysql-real-escape-string-sufficient-for-cleaning-user-input by cc-by-sa and MIT license
'PHP' 카테고리의 다른 글
공유 호스팅에서 마술 따옴표를 끄는 방법? (0) | 2018.09.13 |
---|---|
"치명적인 오류 : PHP의 최대 기능 중첩 수준 '100'도달, 중단 중!" (0) | 2018.09.13 |
PHP에서 디렉토리와 그 전체 내용 (파일 + 하위 디렉토리)을 재귀 적으로 삭제하는 방법은 무엇입니까? (0) | 2018.09.13 |
HTTP POST를 사용하여 HTML 및 PHP로 여러 파일을 선택하고 업로드하려면 어떻게합니까? (0) | 2018.09.13 |
PHP는 연령 계산 (0) | 2018.09.13 |