2013-05-22 2 views
0

이 코드를 사용할 때 안전하지 않으므로 코드에 아무 것도 추가 할 수 없습니까?SQL 인젝션으로 코드를 안전하게 만들 수있는 방법

제가 직접 SQL 주입에 대해 많은 지식을 갖고 있지는 않지만 어딘가에서 작동하는 자체 SQL 주입을 시도했습니다. 하지만 해커가 더 똑똑해서 내 웹 사이트를 정말로 해킹 할 수 있습니다.

URL은 다음과 같습니다

http://example.com/profile.php?userID=1 

PHP

$userID = $_GET['userID']; 
$userID = mysql_real_escape_string($userID); 
$CheckQuery = mysql_query("SELECT * FROM tbl_user WHERE id='$userID'"); 

$CheckNumber = mysql_num_rows($CheckQuery); 
if ($CheckNumber !== 1) 
{ 
    header("Location: tos.php"); 
} 

내가 시도 : 사이트에 많은 일을 숨길

http://example.com/profile.php?userID=1' 

. 내가

http://example.com/profile.php?userID=1' UNION SELECT * FROM tbl_user; with havij it was hacked 

감사를 시도

: |

+0

가능한 중복 http://stackoverflow.com/q/60174/1920232 – peterm

+0

내가 그것을 확인과 중복되지 – deerox

+0

당신이'HTTP를 시도하는 경우 : //example.com/profile.php? userID = 0' - 너무 많은 것을 숨길 것인가? –

답변

-1

mysql_query(sprintf("SELECT * FROM tbl_user WHERE id='%d'", $userID); 

$db = new mysqli(<database connection info here>); 

$stmt = $db->prepare("SELECT * FROM tbl_user WHERE id='?'"); 
$stmt->bind_param("id", $userID); 
$stmt->execute(); 
$stmt->close(); 
+0

아니요,이 방법이 효과가 없습니다! 이런 식으로'(int)'는 질의 문자열의 일부분 일 뿐이다. 당신이 시도 할 수있는 것은 쿼리 스트링 라인을하기 전에'$ userID = (int) $ userID;'입니다. –

+0

지금 질문을 확인하십시오 .. – sAnS

0

사용 mysqli를 시도하거나 최소한의 sprintf 수 있습니다 * 기능이 전혀. PDO 또는 mysqli를 사용하십시오.

http://php.net/PDO

http://php.net/mysqli

PDO 당신을 위해 데이터를 탈출합니다.

그러나 현재 코드에 대한

:

$userID = $_GET['userID']; 
$userID = mysql_real_escape_string($userID); 

if(ctype_digit($userID)) 
{ 
    $CheckQuery = mysql_query("SELECT * FROM tbl_user WHERE id='$userID'"); 

    $CheckNumber = mysql_num_rows($CheckQuery); 
    if ($CheckNumber !== 1) 
    { 
     header("Location: tos.php"); 
    } 
} else { 
    // THE USER ID IS NOT ALL NUMBERS, CREATE AN ERROR 
} 
0

망가 mysql_로를 사용할 준비 :: 값을 type casting

<?php 


$CheckQuery = mysql_query("SELECT * FROM tbl_user WHERE id='".(int)$userID."'"); 

?> 
+0

오래된 웹 사이트이고 코드를 변경하려고하면 다음 달이 걸릴 것입니다 : ( – deerox

+0

좋은 보안을위한 대용품이 없습니다. 불행히도 사용 된 보안이 약해 데이터베이스가 해킹 당하면 회사/귀하의 사람이 문제를 일으킬 가능성이 있습니다 –

+0

예 사실 온라인 게임 – deerox

0

I know i am not secure when i am using this code

이 문장은 잘못된 것입니다.
실제로이 코드는 매우 안전합니다.

그리고 아래에서 제공 한 코드 중 아무 것도 해를 입히지 않습니다. 왜 안전하지 않다고 생각하니?

이렇게하면 은 권장되지 않습니다. 예. 그리고 당신이 쿼리를 포맷하는 데 사용하는 방법 다른 쿼리에 대한 주입으로 이어질 수 있습니다. 그러나 현재 코드는 완벽하게 안전합니다.

의 모든 변수를 따옴표로 묶으면 특수 문자가 이스케이프 처리되므로 쿼리에 넣어도 안전합니다.
두 가지 규칙 중 하나만 생략하면 (즉, 이스케이프하지만 인용이나 인용은하지 만 탈출하지 않음) - 확실히 위험합니다. 하지만 둘 다 따르는 한 안전합니다.

"해킹"에 대한 유일한 이유는 HTML 컨텍스트에 사용 된 작은 따옴표입니다. 경우에 따라 "페이지에서 많은 것을 숨길 수 있습니다." 그러나 SQL 위해, 당신은 여기에 게시 코드와 함께, 그것은 무해한

봐는

http://example.com/profile.php?userID=1' 

코드가 꽤입니다 이러한 쿼리

SELECT * FROM tbl_user WHERE id='1\'' 

를 생성합니다이 링크에서,이다 mysql에 대해서는이고 심지어 1'1으로 캐스팅하므로 id = 1에 대해 레코드를 반환합니다. d 레코드를 찾습니다. 이것이 tos.php 로의 리다이렉트가없는 이유이다.

그래서 문제는 다른 곳에서 발생합니다.

  • 중 하나를 내가
  • 위에 게시 규칙을 따르지 않는 코드가 또는이 문제는 모든 SQL 관련이없는 - 그래서, 당신이 잘못된 트리 짖는하고, 따라서 여전히 계속 어떤
  • 공개 취약점

대부분의 경우 당신은 당신의 가치를 반향해야

+0

적어도 tos.php로 가져 가야한다. 사용 : http://example.com/profile.php?userID=1 ' – deerox

+0

나는 havij와 함께 그것을 직접 시도했다. 그리고 해킹 당했다. – deerox

+0

내가 올바른 테이블 이름 – deerox

관련 문제