2009-10-15 4 views
0
while($info = mysql_fetch_array($data)) { 
// Print out the contents of the entry 
Print "<li><b>Name:</b> ".$info['name'] . " <br />"; 
Print "<b>ID:</b> ".$info['ID']." <br />"; 
Print "<b>Age:</b> ".$info['age'] ." <br />"; 
Print "<b>Location:</b> ".$info['location'] ."<br /> "; 
Print "<form action=delete.php method=POST><input name=ID value="safe(.$info['ID']." type=hidden><input type=submit name=submit value=Remove class=submit></form></li>"; 
} 
Print "</ol>"; 

그건 내 코드입니다. 나는, 그러나,이 라인에 집중하고있다 : 내 이전 게시물 중 하나로 지적되었다양식을 안전하게 제출하여 제출하기

Print "<form action=delete.php method=POST><input name=ID value=".$info['ID']." type=hidden><input type=submit name=submit value=Remove class=submit></form></li>"; 

으로, 그것은 SQL 주입 공격에 안전하지.

나는 다른 게시물에서이 기능을 차용했습니다

function safe($value){ 
    return mysql_real_escape_string($value); 
} 

지금, 어떻게 지옥에서 내가 공격에서이 부분은 안전 할 것인가?

value=".$info['ID']." 

귀하의 지속적인 지원은 대단히 감사하겠습니다.

답변

1

서버에이 항목이 있는지 여부 만 확인하십시오.

이 작업을 수행하려면

$query = 'SELECT * FROM `table` WHERE `ID` = '.(int)$_POST['ID']; 

매우 안전해야 정수로 캐스팅. 문자열 인 경우 변환됩니다. PHP의 유형 저글링을 참조하십시오 : http://www.php.net/manual/en/language.types.type-juggling.php

또한이 항목의 존재 여부를 확인함으로써 데이터가 유효한지 이중으로 확인합니다.

그래서 :

$result=mysql_query('DELETE FROM `savannah` WHERE `ID`='.(int)$_POST['ID']); 
if(!$result){ 
    die(mysql_error()); 
} 
+0

을 귀찮게 하는가? 내 자신의 교육을 위해 만드는 것은 ID 만 찾는 DELETE를 사용합니다. 그러나 데이터베이스에 입력하는 문자열을 보호하고 싶습니다. 어떤 충고? –

+0

이미 정수로 캐스팅 된 경우에는 mysql_real_escape_string이 필요하지 않습니다 (이미 정수이기 때문에 그 안에 재미있는 문자가 없습니다!). – mauris

+0

오케이. ID 필드 유형은 int (1)입니다. 그래서 정수입니다. 그러나 이것은 ID를 추측하는 사람들로부터 나를 보호하지 못합니다. 그래서 지금 작성한이 코드를 구현하려고하는데, delete.php에 어디에 넣어야할지 확신이 서지 않습니다. $ result = mysql_query ("savannah WHERE ID = '. (int) $ _ POST ['ID ']"에서 삭제) 또는 die (mysql_error()); 이 오류를 제공합니다. –

2

당신이

공격이 코드를 보호하기 위해, 당신은 당신이 인증이 있는지 확인해야합니다 (너무 강조 수 없습니다) 탈출이 필요 YES YES YES 사용자. 이 페이지를보고있는 사용자가 로그인 했습니까? 그렇다면 세션은 어디에 저장되어 있습니까?

데이터를 읽을 때 사용한 논리가 무엇이든간에 데이터를 삭제할 때 사용해야합니다.

// Read data in at top to prevent E_STRICT errors if user messes with Query string  
$User_ID = $_SESSION['User_ID']; //assuming it was authenticated 
$a_filter = (isset($_POST['a_filter']) ? $_POST['a_filter'] : ''); 

$query = " 
    SELECT 
     a, b, c 
    FROM 
     table 
    WHERE 1 
     AND a  = " . mysql_real_escape_string($a_filter) . " 
     AND User_ID = " . intval($User_ID) . " 
    "; 

그 쿼리는 보장합니다 : 해당 사용자는 자신의 기록을 볼 수 있습니다

  1. 있다.
  2. 그들이 보내는 데이터를 해킹하는 것이 중요하지 않다면 이스케이프 처리됩니다. 이제 HTML로 인쇄 할 때

, 당신은 XSS 공격으로부터 보호해야합니다 :

<td><?= htmlspecialchars($data); ?></td> 

하거나 속성에있는 경우 :

<input type="text" name="a_filter" value="<? htmlspecialchars($data, ENT_QUOTES); ?>" /> 

이제, 때를 레코드를 지우고 같은 세이프 가드를 적용했는지 확인하십시오.


이 게시물이

// Read data in at top to prevent E_STRICT errors if user messes with Query string 
$User_ID = $_SESSION['User_ID']; //assuming it was authenticated 
$ID  = (int) (isset($_POST['id']) ? $_POST['id'] : 0); 

$query = " 
    DELETE FROM 
     table 
    WHERE 1 
     AND ID  = " . intval($ID) . " 
     AND User_ID = " . intval($User_ID) . " 
    "; 

는 SQL을 탈출 HTML을 탈출, HTML 속성을 탈출하고, 쿼리 권한을 보장 덮여.

여기서 탈출 위치에 대한 짧은 포스트가 중요하다 : 여기
http://blog.gahooa.com/answers/what-kind-of-data-needs-to-be-escaped/

+0

와우. 고맙습니다. –

1

보안은 아마도 다단계해야한다 - 당신이 특정 분야에서 할 수있는 다른 많은이 아니다.

사용자를 식별 할 수있는 고유 한 세션이 있습니까 (아직 세션을 설정하지 않은 경우에도이 작업을 간단하게 수행하기가 어렵지 않습니다).

예인 경우 해당 사용자가 일반적으로 항목 또는 특히 해당 항목을 삭제할 수 있는지 확인할 수 있습니다. 간단한 주입 공격으로부터 보호해야

는 ... 정수 값을 탈출하기위한 같은

- 나는 일반적으로 정수로 입력되는 값을 캐스팅하고는 일반적으로 악성 문자와 유효하지 않은 입력의 문제를 제거합니다

문자열이 아닌 숫자 인 경우

$safe['value'] = (int) $_POST['value']; 
, 당신의 안전 값은 0

편집 될 것입니다 : 나는 단순히 데이터베이스 필드 어쨌든에서 안전하지 않은 정수는 사실에 의존 언급해야하고, 탈출없이 또는 c 쿼리를 작성하기 전에 입력을 무시하고 SQL 인젝션을 시작합니다.

관련 문제