2014-01-25 2 views
1

저는 웹 보안 분야의 전문가이며 이틀 동안 연구하고 있습니다. OWSAP에 따르면 SQL 인젝션과 XSS 공격은 인터넷을 통해 가장 많이 발생하며 최소에서는 모든 프로그래머가 처리해야합니다.PHP 웹 사이트의 보안 전략 : SQL 인젝션, XSS 공격 및 2 차 SQL 인젝션

그래서 내가 그들에게 (만약 내가 잘못 당신이 그것을 수정하거나 추가 요청) 따르고 보호하기 위해 이해 무엇 :

Use PDO and prepared statements to prevent SQL Injection

PDO와 준비가 문을 방지하기에 충분하다 (일차) SQL 인젝션 (Injection)을 지원하므로 드라이버가이를 처리 할 때 입력 데이터를 이스케이프 처리 할 필요가 없습니다.

하지만이는 원시 데이터를 저장하고 방지하기 위해이 날을 만들면서 ' OR '1'=' 같은 데이터가 PDO와 준비된 문을 통과 한 후 데이터베이스에 저장받을 수 있습니다 2 차 SQL 주입 (see this for more)하는 경향이 당신을 이끌 수 있습니다 오히려 먼저 문자열을 탈출 느낄 따라서

use $pdo->quote($string) before passing it to prepared statement for storage

그러나 나는 또한 XSS 공격에 대한 보호 기능을 원하기 때문에 내가 (최소 경우 또는 htmlspecialchars())뿐만 아니라 htmlentities()를 사용한다 .I이 출력에서이 작업을 수행해야하지만 에서 사용하는 것을 선호 할 수 있습니다. 내 출력은 HTML의 대상이되는 경우

을 ouputting 동안 입력 측에만

요약하면, 내 단계는 단순히 데이터베이스에서 저장된 필드를 에코

$string ='raw input from user'; 
$escaped_string=$pdo->quote(htmlentities($string)); 
$pdo->execute('query to store $escaped_string into the database'); 

될 것이다.

내 접근 방식이 안전한지 여부를 알고 싶습니다.

+3

이 질문은 ..? – sunshinekitty

+0

예 내 접근 방식이 안전한지 알고 싶습니다. –

+0

@InsaneCoder 당신의 접근 방식은 혼란 스럽습니다 ... 그리고 내가 흔히 볼 수있는 일반적인 실수는 어디에서나 코드에서 다시 볼 수 있습니다. 몇 가지 정보는 내 대답을 참조하십시오. 질문이 있으시면 구체적으로 질문하십시오. – Brad

답변

3

코드가 2 차 공격에 노출되어있는 경우 준비된 쿼리를 올바르게 사용하지 않고 수행중인 작업을 근본적으로 이해하지 못합니다.

쿼리에서 데이터를 이스케이프 처리하는 것은 명령에서 데이터의 모호성을 제거하는 것입니다. 쿼리에서 매개 변수를 사용하는 것은 명령에서 데이터를 근본적으로 분리하는 것입니다. 이 두 가지 모두 데이터가 데이터베이스에 저장되는 방법과는 전혀 관련이 없습니다.

모든 쿼리에는 사용자가 임의의 데이터에 사용되는 매개 변수를 사용해야합니다. 이 작업을 수행하지 않으면 보호 기능이 전혀 없으며 의심 할 바없이 응용 프로그램에 오류가 발생할 수 있습니다. 항상은 자신의 데이터베이스에서 가져온 경우에도 임의의 데이터에 대해 매개 변수가있는 쿼리를 사용합니다 (실제로 이러한 매개 변수를 사용합니다). 누가 데이터의 출처를 예측할 수없는 경우 쿼리에서 직접 사용할 수 없다는 것을 알고 있습니다.

XSS 공격의 경우 HTML 페이지를 출력하는 경우 HTML 컨텍스트에서 사용할 수 있도록 데이터를 올바르게 이스케이프 처리하여 일부를 막을 수 있습니다. 이렇게하면 텍스트가 보존되는 HTML 컨텍스트에서 임의의 문자열을 사용할 수 있습니다. 이것은 HTML 용 데이터를 이스케이프합니다. 즉, 텍스트가 HTML 태그로 구문 분석되지 않습니다. 이전에는 출력에서 ​​이스케이프를 수행하면 안되며 데이터를 조기에 조종하여 다른 목적으로는 사용할 수 없게 만듭니다.

+0

당신의 지원에 감사드립니다.하지만 아마도 HTML 형태로 데이터베이스에 저장된 기사가 '

'과 같이 출력 될 때 'htmlentities()'를 사용할 수 없습니다. 기사
이것은 예술품

이므로 이러한 태그를 구문 분석하고 싶습니다. –

+0

이것에 관해서는 BBCode를 사용하십시오. 그래서 html 태그 사용을 피할 수 있습니다. – sunshinekitty

+0

@InsaneCoder이 경우에는 이스케이프 문제가 없습니다. (당신은 HTML 컨텍스트에서 HTML을 사용하고 있습니다 ... 필요한 것은 탈출 할 필요가 없습니다.) 당신은 받아 들일 수있는 태그를 화이트 리스팅해야 할 필요가있는 다른 문제가 있습니다. 그러나 문법 오류가 발생하지 않도록이 점에 매우주의해야합니다 이 게시물을 확인하십시오 : http://stackoverflow.com/questions/5512712/sanitizing-html-input 그리고 아니오, 반드시 BBCode를 사용할 필요는 없습니다 ... 구문을 변경해도 수정되지 않습니다. 이 문제. – Brad

-1

사용자의 원시 입력을 피할 수없는 경우 사용자로부터 원시 입력을받지 못하는 경우 표준 절차입니다.예 :

이러한 유형의 저장 프로 시저를 사용하는 것이 가장 좋습니다.

<?php 
    if(isset($_POST['submit'])) { 
     if($_GET['sort'] == 'alphad') { 
      $sort = 'alphad'; //not = $_GET['sort'] 
      //Your query 
     } 
    } 
?> 
+0

물론 응용 프로그램이 아무 것도하지 않으면 사용자의 데이터를 수락하지 마십시오. 그리고 저장 프로 시저는이 문제에 대한 적절한 대답이 아닙니다. – Brad

+0

내가 사용자로부터 데이터를 허용하지 않는다고 말한 적이 없다고 믿는다면, 이것은 이와 같은 임의의 데이터를 다룰 때 가장 좋은 절차입니다. – sunshinekitty

+0

기본적으로 준비된 쿼리를 사용하지 말라고 말하고 있습니다. – sunshinekitty

0

그러나 이것은 2 차 SQL 주입

이 할 수있다, 실제로,하지에 당신이 경향이 발생할 수 있습니다. "2 차 SQL 주입"과 같은 것은 없습니다. SQL 인젝션 만 있습니다. 이를 막으려면 매개 변수화 된 쿼리를 사용해야합니다. 저것과 같이 쉬운. 즉 것은 원시 만들기 - 명시 적으로 말했다 경우 템플릿는 기본적으로 어떤 값을 탈출 HTML을, 또는 어떤 다른 서식을 적용 할 수 있도록 ouputting 동안

는 단계

$string ='whatever string'; 
$pdo->prepare('any query that uses ? placeholder for any data'); 
$pdo->execute([$string]); 

될 것이라고 요약하자면, html 형식의 텍스트.