2013-08-19 3 views
0

Google 웹 페이지에서 취약점을 검사했습니다. 다음 쿼리에서 중요한 블라인드 SQL 주입을 받았습니다. 준비된 진술을 사용하고 있습니다. SQL Injection 공격을 막기 위해 내가 할 수있는 또 다른 조치는 무엇입니까? 저에게 알려주세요. 여기에 내 예제 코드가있다. 나는 어떤 제안을 주셔서 감사합니다.블라인드 SQL 인젝션 방지

$first_name = $_POST["first-name"]; 
$middle_name = $_POST["middle-name"]; 
$last_name = $_POST["last-name"]; 

$qry = $pdo_conn->prepare('INSERT INTO table1(first_name, last_name, middle_initial) VALUES (?, ?, ?)'); 
$qry->execute(array($first_name, $last_name, $middle_name)); 
+1

블라인드 SQL 삽입을 트리거 한 POST 데이터가 있습니까? –

+0

이미 PDO 개체를 사용 중입니다. 이 질문을 게시하기 전에 웹에서 조사했습니다. 잘못된 것이 있으면 알려주세요. – nav100

+0

@RandomSeed - OP가 이미 준비된 문을 사용 중임을 참고하십시오. –

답변

0

Blind SQL Injection 나는 "블라인드 SQL 인젝션의 개념에 익숙하지 않다 ",하지만 내가 이해하는 바에 따르면, 우리 모두가 알듯이 (결과의 해석 만 다르다.) 일반적인 SQL 코드 주입과 똑같이 작동한다.

준비된 명령문을 사용하고 있으므로 잠재적으로 위험한 모든 SQL 코드가 이스케이프되며이 경고에 대해서는 걱정할 필요가 없습니다. 면책 조항 : 나는 변호사 보안 컨설턴트가 아닙니다.

+1

그래도 여전히 2 차 SQL 주입이되어야합니다. –

+0

@RaymondNijland 의미가 있습니다. 예,이 코드는 그 코드에 취약 할 수 있습니다. – RandomSeed

+0

* this * 코드는 2 차 주문에 취약 할 수 있습니까? –

-2

첫 번째 이탈 문자.

$first_name = $_POST["first-name"]; 
$safe_variable = mysql_real_escape_string($first-name); 
+2

OP가 이미 바인드 변수와 함께 준비된 문을 사용하는 경우에는 문자열 이스케이프를 권장하지 않습니다. –

+2

그리고 mysql_ * 함수는 다음과 같이 사용되지 않습니다. PHP 5.5에서.? –

+5

** 잘못되었습니다. 들어오는 데이터를 벗어나지 마십시오. 데이터가 손상됩니다.** PDO가 처리하므로 문자열을 벗어날 필요가 없습니다. 또한, mysql_ 함수는 PDO와 함께 사용해서는 안됩니다. –

-1

당신은 또한 이런 식으로 작업을 수행 할 수 있습니다

$qry = $pdo_conn->prepare('INSERT INTO table1(first_name, last_name, middle_initial) VALUES (?, ?, ?)'); 

$qry->bindParam(1,$first_name); 
$qry->bindParam(2,$middle_name); 
$qry->bindParam(3,$last_name); 

$first_name = strip_tags(mysqli_real_escape_string($qry,$_POST["first-name"])); 
$middle_name = strip_tags(mysqli_real_escape_string($qry,$_POST["middle-name"])); 
$last_name = strip_tags(mysqli_real_escape_string($qry,$_POST["last-name"])); 

$qry->execute(); 

블라인드 SQL 인젝션에 대한 자세한 도움말을 참조하십시오 Sql Injection

+1

mysql_ * 함수는 PHP 5.5에서 제외되었습니다.? 그리고 strip_tags는 HTML 태그와 PHP 태그를 SQL 인젝션으로부터 보호하지 못합니다 ... –

+0

네가 맞다.하지만 5.5 이전에는 5.1 이후부터 사용하지 않았고, depreciated는 쓸모가 없다는 뜻이다. – Rahul

+0

더 이상 지원되지 않을 수 있습니다. "쓸모 없음"을 의미하지만 때로는 사물이 더 이상 사용되지 않으므로 더 이상 사용되지 않습니다. mysql_는 PDO로 대체되었고 mysqli_는 – Quentin

0

경우가 여기에 게시 된 실제 코드입니다, 는 더 주입 취약점이 없습니다. "맹인"도 아니고 다른 유형도 아닙니다.

이 코드에는 개선이 필요하지 않습니다.

잘못된 경보를 발생시키지 않는 더 나은 스캐너를 찾아야합니다.

+0

PDO :: ATTR_EMULATE_PREPARES 때문에 나는 PHP 소스 코드에서 발견 된 기본값이 무엇인지 궁금합니다. 서명되지 않은 emulate_prepare : 1; PDOX MYSQL 드라이버가 항상 에뮬레이션을 사용하는 C 비트 필드는 ... 제게 이것이 (PDO가) 왜 발견되지 않는지 걱정 스럽습니다. 어쩌면 PDO가 기본 클라이언트 측에서 렌더링을 준비하고 있습니다. 무엇이 안전하지 않을 수도 있습니다. 강력하게 사용하도록 권고한다 -> setAttribute (PDO :: ATTR_EMULATE_PREPARES, false); 항상 문자 세트를 정의하십시오 –

+0

에뮬레이션 모드는 전혀 중요하지 않습니다. –