2012-08-08 2 views
1

일반적인 SQL 인젝션에 대해 많은 것을 읽었으므로 문제를 해결하는 방법에 관심이있었습니다. 방금 사용하기 전에 addslashes() 생각 (잘못)에 맞을 것입니다. 그런 다음 mysql(i)_real_escape_string()addslashes()보다 유용하고 신뢰할 수 있다는 것을 발견했습니다. 그 이후로 나는 mysqli_real_escape_string()을 사용하지만 최근에 나는 내가 정말로 이해하지 못했던 것을 얻었습니다. mysql 및 문자 집합에 데이터를 보내는 것에 대해 몇 가지 문제점이있었습니다. 그래서 다시 한 번 검색해 보았습니다. 많은 사용자는 SET NAMES UTF8이 모든 것을 올바른 방향으로 만드는 방법이라고 말합니다. 하지만 그 쿼리를 사용하면 mysqli_real_escape_string()이 작동하지 않는다는 것을 읽었습니다.SQL 문을 이스케이프 처리하는 올바른 방법은 무엇입니까?

결국 나는 조금 혼란 스러웠습니다.

SQL 문을 이스케이프 처리하는 올바른 방법은 무엇입니까?

SET NAMES UTF8을 사용하는 잠재적 착취는 무엇입니까?

mysqli_set_charset() 올바른 연결 방법은 지정된 문자 집합에서 통신 할 수 있습니까?

mysqli_sey_charset()을 사용하면 프로세스에서 변경된 mysql의 내부 변수가 있습니까?

감사

+0

게시물을 편집하고 'mysqli_real_escape_string()'에 의해 처리되기 전후의 SQL 예제를 포함하십시오. –

답변

0

질문과 답변 모두에서 많은 잘못된 정보를 바로 잡으십시오.

  1. "statement"가 아니고 문자열 리터럴입니다. "SQL 문"을 이스케이프 처리하면 바로 주입 할 수 있습니다. 문자열 만 이스케이프 처리해야하지만 다른 쿼리 파트에서는 ​​별개의 절대적으로 다른 서식을 사용해야하며 이스케이프 처리만으로는 별 효과가 없습니다.
  2. 이스케이프/인코딩 엉망은 GBK와 같은 일부 한계 인코딩에만 연결됩니다. UTF-8을 사용하면 addslashes()도 사용할 수 있습니다.
  3. 5.3 PDO는 DSN에 설정되어있는 한 클라이언트 인코딩을 설정하면 문제가 없습니다.

SQL 문을 이스케이프 처리하는 올바른 방법은 무엇입니까?

In PHP when submitting strings to the database should I take care of illegal characters using htmlspecialchars() or use a regular expression?

SET의 이름 UTF8을 사용하여 가능한 공격은 무엇입니까?

없음

가 mysqli_set_charset() 연결이 지정된 캐릭터 세트로 의사 소통을 할 수있는 올바른 방법은?

확실히.
HTML 페이지에 사용 된 실제 문자 세트를 입력해야합니다.

2

당신은 SQL 주입을 방지하기 위해 mysqli prepared statements을 사용할 수 있습니다 - 문자 세트 인코딩에 대해 걱정할 필요없이.

의 링크 예 :

<?php 
$mysqli = new mysqli("localhost", "my_user", "my_password", "world"); 

/* check connection */ 
if (mysqli_connect_errno()) { 
    printf("Connect failed: %s\n", mysqli_connect_error()); 
    exit(); 
} 

$city = "Amersfoort"; 

/* create a prepared statement */ 
if ($stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?")) { 

    /* bind parameters for markers */ 
    $stmt->bind_param("s", $city); 

    /* execute query */ 
    $stmt->execute(); 

    /* bind result variables */ 
    $stmt->bind_result($district); 

    /* fetch value */ 
    $stmt->fetch(); 

    printf("%s is in district %s\n", $city, $district); 

    /* close statement */ 
    $stmt->close(); 
} 

/* close connection */ 
$mysqli->close(); 
?> 
+0

이 방법을 사용할 수 없습니다. 그리고 나는 또한 어떻게 작동하는지 이해하고 싶습니다. – Kei

+0

@kei 왜이 방법을 사용할 수 없습니까? – Fluffeh

+0

내가 말했듯이 나는 일이 어떻게 작동 하는지를 알고 싶기 때문에 나의 질문은 정확합니다. 그런 다음 프로젝트에서 표준 방법을 사용하기로 결정 했으므로 "이 방법으로 모든 것을 만들어 봅시다"라고 말할 수는 없습니다. – Kei

0

수동으로 구성된 쿼리를 전달은 이전 버전과의 호환성 문제로 인해 지원됩니다. 현대적인 응용 프로그램에서는 절대로이를 수행하지 말고 준비된 문을 대신 사용해야합니다.

수동으로 생성 된 쿼리를 사용하여 죽은 사람이라면 이스케이프 방법은 mysql_real_escape_string()을 사용하고 인코딩을 UTF-8로 설정하는 것입니다.

당신은 OWASP 사이트에서 자세한 내용은 찾을 수 있습니다 https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet

0

만큼 당신이 명시 적으로 연결 개체의 문자 세트를 설정하면서, 당신은 괜찮을 것 :

mysql_set_charset('utf8', $db); // for mysql 
$db->set_charset('utf8'); // for mysqli 

와 같은 문제를 문자 집합은 PDO 준비 문에 적용되므로 PDO가 권장되는 방법이지만이 경우 사용자를 안전하게 만들지는 못합니다.

mysqli_real_escape_string()에 정의 된 문자 집합을 사용하는 데 문제가 없습니다. HTML 페이지뿐 아니라 연결 객체에도 UTF-8을 사용하므로 많은 문제를 피할 수 있습니다.

이 주제에 대해 가장 잘 설명하는 내용은 PHP 작성자 인 ircmacell이 mysql_real_escape_string()에 한 번, PDO에 한 번 쓴 것입니다.

관련 문제