문제

내 코드를 형식화하지 않아서 죄송합니다. 도구 모음이 사라졌습니다 ...

MySQL DB에 일부 데이터를 삽입하고 싶습니다. PHP에서 기능을 썼습니다.

function add_ID($ID, $token)  {
 $add = "INSERT INTO ids (ID, token) VALUES ('$ID', '$token')";
 mysql_query($add);
 echo 'added successfully';
}  
if(isset($_GET['addDeviceID'])) {
 add_ID($_GET['ID'], $_GET['token']);
}

내 Browswe의 URL 필드에서 나는 다음과 같은 기능이라고 부릅니다.http://www.justanexample.com/example.php?id=123123123&token=qwertzuiop

작동합니다.

예를 들어 다음과 같은 매개 변수 중 하나에 공간을 넣으면 다음과 같습니다.http://www.justanexample.com/example.php?id=123123 123 & 토큰 = QWERTZUIOP

MySQL DB에 아무것도 추가되지 않았습니다.

도움을받는 것이 좋을 것입니다 :) 감사합니다!

도움이 되었습니까?

해결책

기능은 SQL 주입에 취약합니다. SQL 쿼리에서 사용하기 전에 모든 사용자가 수신 한 매개 변수를 검증하고 모든 문자열을 통과해야합니다. mysql_real_escape_string, 그런 다음 나는 example.php?token='; DROP DATABASE; 그리고 당신의 응용 프로그램을 왕실하게 망쳐 놓으십시오.

귀하의 경우, 수신 된 매개 변수가 먼저 기대하는 양식인지 확인하고, 그렇지 않은 경우 사용자에게 오류를 반환 한 다음 SQL 쿼리로 전달해야합니다.

function add_ID($ID, $token)  {
  $id = mysql_real_escape_string($id);
  $token = mysql_real_escape_string($token);

  $add = "INSERT INTO ids (ID, token) VALUES ('$ID', '$token')";
  mysql_query($add);
  echo 'added successfully';
}  

if(isset($_GET['addDeviceID'])) {
  $id    = isset($_GET['id']) ? $_GET['id'] : 0; // in case no ID has been passed in
  $token = isset($_GET['token']) ? $_GET['token'] : '';

  if (!is_numeric($id) {
    die('ID is not a number');
  } 

  // validate token here as well

  add_ID($id, $token);
}

또한 매개 변수를 사용하는 것보다 매개 변수로 SQL 쿼리를 수행하는 전반적으로 훨씬 더 나은 방법입니다. 이를 위해 MySQL 대신 MySQLI 확장자 또는 더 높은 수준의 PDO를 사용하십시오.

다른 팁

데이터베이스로 보내기 전에 입력을 검증해야합니다. 또는 유효성 검사가 불가능한 경우 필터 및/또는 값을 피하십시오.

확인

당신이 기대한다면 ID 0보다 큰 정수가 되려면 :

if (!ctype_digit($ID)) {
    // invalid ID
}

당신이 기대한다면 토큰 영숫자 문자열이 되려면 :

if (!ctype_alnum($token)) {
    // invalid token
}

필터링

필터링은 입력의 유효하지 않은 부분을 제거하여 유효하게됩니다.

if (!ctype_digit($ID)) {
    $ID = preg_replace('/\D+/', '', $ID);
    // $ID does now only contain digits
}
if (!ctype_alnum($token)) {
    $token = preg_replace('/\D+/', '', $token);
    // $token does now only contain alphanumeric characters
}

탈출

ESCAPING은 특정 컨텍스트의 메타 문자를 대체합니다. 일부 문자열에는 배치해야 할 일부 문자열이 있습니다. MySQL 쿼리의 경우 메타 문자를 피하는 함수를 사용해야합니다. 문맥 MySQL의 문자열 선언. PHP는 다음과 같습니다 mysql_real_escape_string 기능 그 목적을 위해 :

$add = "INSERT INTO ids (ID, token) VALUES ('".mysql_real_escape_string($ID)."', '".mysql_real_escape_string($token)."')";

사용하여 공간을 제거하십시오 str_replace 기능 EG :

 $ID = str_replace(' ', '', $ID);
 $token= str_replace(' ', '', $token);

 $add = "INSERT INTO ids (ID, token) VALUES ('$ID', '$token')";

또한 $ ID가 테이블의 정수 필드라고 생각하므로 인용문을 지정하지 않고 쿼리를 실행할 수 있습니다.

 $add = "INSERT INTO ids (ID, token) VALUES ($ID, '$token')";

코드는 오류가 있는지 확인하지 않고 쿼리가 성공적으로 완료된 것으로 가정합니다. 공백으로 인해 구문 오류가 될 것 같아요. ID 필드가 정수 유형이라면 ID=123 123 구문 오류가됩니다. 다른 답변에 모든 SQL 주입 및 데이터 소독 조언을 포함하여 다음과 같이 add_id 기능을 다시 작성해야합니다.

function add_ID($ID, $token) {
  $query = 'blah blah blah';
  mysql_query($query);
  if (mysql_error()) {
       echo 'ruhroh, someone set us up the bomb: ', mysql_error();
  } else {
       echo 'woohoo, it worked!';
  }
}

적어도 이것은 쿼리가 실제로 성공했는지, 그리고 그렇지 않은 경우 어떻게 발생했는지 알려줄 것입니다. 어떤 종류의 데이터베이스 쿼리가 성공할 것이라고 가정하지 마십시오. 위와 같이 단순한 오류 처리조차하지 않기 위해 폭파 (서버 사망, 트랜잭션 교착 상태, 연결 풀, 디스크 공간 등)가 너무 많습니다.

str_replace를 사용하여 공백을 제거 할 수 있습니다. 그러나 그것은 좋은 연습이 아닙니다. URL을 어떻게 그렇게 수정할 수 있습니까? 정상적인 경우에는 비현실적입니다. 반대로, 사용자의 모든 입력 값을 테스트해야합니다 (ID는 정수이어야합니다. 토큰에는 "" "기호 및 기타 점검이 포함되어 있지 않아야합니다). SQL-injections에 대해 읽으십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top