2010-02-05 3 views
1

를 사용하여 :SQL 오류 내가 거기에 아포스트로피 뭔가를 게시하려고 할 때마다 나는 다음과 같은 오류를 받고 있어요 아포스트로피

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near... 

예를 들어 내가 "와 같은 INSERT 뭔가를 사용하여/게시려고 할 때 '열심히 노력하고있어.' 내가 "열심히 일하고있다"라고 쓰면 모든 것이 소멸됩니다.

코드는 다음과 같습니다

$sql="INSERT INTO tb_table (`postcontent`, `userid`, `posttime`) VALUES ('".$_POST[content]."', '".$user_id."', '".time()."')"; 

모든 아이디어를 어떻게 그것을 해결하기 위해?

답변

4

어포 스트로피를 사용하여 필드의 각 값의 시작과 끝을 MySQL에 표시하기 때문입니다. 문자열의 중간에 아포스트로피를 넣으면 갑자기 데이터베이스가 3 개의 테이블 필드에 4 개의 값을 넣으려고한다고 생각합니다.

PHP를 사용하여 데이터베이스에 데이터를 삽입 한 것처럼 보입니다. 따라서 PHP에서 제공하는 방법으로이 문제를 처리하는 몇 가지 예를 살펴 보겠습니다.

빠른 방법은 mysql_real_escape_string()를 사용하도록 수정합니다 :

$db = // your mysqli() connection 

$sql="INSERT INTO tb_table (`postcontent`, `userid`, `posttime`) 
      VALUES (?, ?, ?)"; 

if ($stmt = $db->prepare($sql)) 
{ 
    $stmt->bind_param("ssi", $_POST['content'], $user_id, time()); 
    $stmt->execute();   
    $stmt->close(); 
} 

추신 :

$sql="INSERT INTO tb_table (`postcontent`, `userid`, `posttime`) 
     VALUES ('" . mysql_real_escape_string($_POST['content']) . "', 
       '" . mysql_real_escape_string($user_id) . "', 
       ".time().")"; 

더 나은 방법이 prepared statements를 사용하는 것 시간() 주위에 작은 따옴표가 필요하지 않습니다. 이것은 숫자이며, 그대로 삽입해도 안전합니다.

+0

감사합니다! 그것을 고쳤다. – Izumi

+0

mysql_real_escape_string을 사용해야합니다. mysql_escape_string은 특정 연결 문자 세트와 설정에서 깨진다. – bobince

+0

고마워, 내 잘못. 코드를 수정했습니다. 이런 식으로 쿼리를 작성한 지 꽤 오래되었습니다. :) – Rowlf

2

동적으로 생성 된 SQL을 사용하기 때문에 삽입되는 값의 인용 부호가 INSERT 문의 값을 둘러싸는 따옴표를 닫습니다.

최상의 솔루션은이 문제를 방지하고 더 안전 할 수있는 매개 변수화 된 SQL을 사용하는 것입니다 (SQL 주입 방지). 그렇지 않으면 제공된 값을 구문 분석/안전화해야합니다 (예 : 모든 작은 따옴표를 이스케이프 처리하여 문을 닫지 않도록하십시오.

1

어떤 식 으로든 대중이 쉽게 접근 할 수 있다면 지금 가져 가서 SQL 주입 공격에 대해 읽어보십시오. 가장 좋은 해결 방법은 매개 변수가있는 쿼리를 사용하는 것입니다. 그러나 텍스트의 따옴표가 텍스트의 일부가 아닌 SQL 명령의 일부로 해석되기 때문에 일종의 이스케이프 메커니즘을 사용해야합니다.

당신이 의견을 제출하면 무슨 일이 일어날 지 생각해

', 'No-one', time()); DROP TABLE tb_table; // 

귀하의 SQL :

$sql="INSERT INTO tb_table (`postcontent`, `userid`, `posttime`) VALUES ('".$_POST[content]."', '".$user_id."', '".time()."')" 

그런 다음 문자열로 확장 :

INSERT INTO tb_table (`postcontent`, `userid`, `posttime`) VALUES ('', 'No-one', now()); DROP TABLE tb_table; //', 'user', 'time')" 
관련 문제