2013-07-15 2 views
0

SQL 쿼리를 사용하여 변수에 JSON을 저장하는 PHP 스크립트가 있습니다. 쿼리는WHERE 문에서 문자열 (변수) 비교

$value = $_GET['value']; 

SELECT column1 AS 'col1', column2 AS 'col2', column3 AS 'col3', column4 AS 'col4', column5 AS 'col5' 
FROM db.dbo.table 
WHERE column5 = $value 

변수가 다른 페이지에서 오는 이런 걸 (I보다 일반적인 뭔가에 열 이름을 변경 한)이며, 또는 공백을 포함하지 않을 수 있습니다 문자열입니다. 그러나이 JSON 반환하지 않는 이유는 확실하지 않아요 (그것은 그냥 [] 반환합니다). 이 예제 스크립트는 SQL Server에서 완벽하게 작동하지만 PHP로 실행하려고하면 작동하지 않습니다. WHERE column5 = $value 행을 없애면 JSON이 반환됩니다. 이것은 내가이 작은 것을 확신하지만, 누군가가 잘못이 무엇인지 말해 줄 수 다른 페이지

return '<a href="/script.php?value=' + data + '" target="_blank">Example</a>' 

에 JS 스크립트에 변수를 전달 라인입니까? 감사합니다.

+0

따옴표가 없습니다. '... where where column5 = '$ value ''. params 탈출도 잊지 마십시오. – Fracsi

답변

2

.

첫 번째

은 당신 신뢰 사용자 입력 : 하나는 임의의 쿼리를 실행할 수 없도록 이것은 (예 SUBSELECT에서), $value의 탈출의 일종으로 대체해야

$value = $_GET['value']; 

및 일부 쿼리에서 DELETE 또는 DROP 명령을 발행 할 수있는 경우 서비스 거부를 유발할 수 있습니다.

prepared statements의 현명한 사용으로
SELECT column1 AS 'col1', column2 AS 'col2', column3 AS 'col3', column4 AS 'col4', column5 AS 'col5' 
FROM db.dbo.table 
WHERE column5 = '$value' 

, 당신은 한 번에 두 문제를 완화 할 수

두 번째 문제는 값이 공백을 포함 할 수 있으며, 당신이 인용 부호를 추가하지 않는 한이 SQL 구문을 깰 것입니다.

같은 두 번째 문제의 또 다른면은 URL을 통해 전달 된 값 (등등 예를 들어, +, % 등) URL 인용 문자가 포함 된 경우, 탈출 문제로 실행하거나 인코딩 문제의 경우 수도 인 값 인코딩 경계를 넘어서거나 (예 : 원래 페이지가 또는로 인식되거나 , ISO-8859-15, 데이터베이스가 UTF-8 또는 그 반대로 인식 될 수 있음)이 마지막 문제는 "one-size-fits-all"솔루션 - 비록 준비된 문장 일 수도 있고 help -을 사용하고 변수의 인코딩 경로를주의 깊게 확인하거나 모든 것을 항상 UTF-8로 변환하도록 요구합니다. 국제적인 차를 배치하여 위험에 처해 있는지 여부 라이터 (예 : "à") 링크가 포함 된 페이지의 값 안에 무엇이 발생하는지 확인합니다.

+0

쿼리에 전달 된 값을 사용자 입력에서 제공하지 않습니다, 그래서 이것이 필요하다고 생각하지 않습니다.그러나 이것은이 문제를 가진 다른 누구에게나 더 좋은 대답이 될 것입니다. – TFischer

2

where 절에 인용문을 추가하십시오. 예 : where column5 = '$value'

+0

오, 알겠습니다. 이 스크립트는 다른 스크립트에서 작동했기 때문에 혼란 스러웠습니다. 그러나 그 변수는 정수였습니다. 문자열을 따옴표로 묶어야한다는 사실을 잊어 버렸습니다. 감사! – TFischer

+0

반갑습니다. 필요한 것을 갖고 계시다면 대답을 받아 들일 수있을 정도로 친절하시기 바랍니다. 감사합니다 –

0

시도 :

$sql = "SELECT column1 AS 'col1', column2 AS 'col2', column3 AS 'col3', column4 AS 'col4', column5 AS 'col5' FROM db.dbo.table WHERE column5 = '$value'"; 
(따로 준비된 문을 사용하지 않는에서) 당신의 접근 방식 두 가지 문제가 있습니다
2
$query="SELECT column1 AS 'col1', column2 AS 'col2', column3 AS 'col3', column4 AS 'col4', column5 AS 'col5' FROM db.dbo.table WHERE column5 ='". $_GET['value']."'"; 
OR 
$query="SELECT column1 AS 'col1', column2 AS 'col2', column3 AS 'col3', column4 AS 'col4', column5 AS 'col5' FROM db.dbo.table WHERE column5 ='". $value."'";