2009-12-03 3 views
1

여기가 내 첫 번째 질문이며 빠른 답변을 얻으려면 충분히 간단 할 것입니다. 나는 $ 변수를 에코 경우

$variable = curPageURL(); 
$query = 'SELECT * FROM `tablename` WHERE `columnname` LIKE '$variable' ; 

, 그것은 내가 원하는 (내 페이지에 자바 스크립트입니다) 현재 페이지의 URL을 궁극적으로

를 인쇄합니다

기본적으로, 나는 다음과 같은 코드가 있습니다 검색 - 용어가 현재 페이지의 URL 인 검색을 전후에 와일드 카드를 사용하여 수행 할 수 있어야합니다. 이것이 가능하다면 나는 확신 할 수 없다. 또는 단순히 오류가 없기 때문에 나는 단순히 구문 오류가있다.

내가 시도 :

$query = 'SELECT * FROM `tablename` WHERE `columnname` LIKE '"echo $variable" ' ; 

을 그러나 다시, 나는 아마 없거나 " '잃어 버렸던를 사용하고, 등

내가 잘못 뭘하는지 알려주세요

+0

어떤 언어입니까? 문자열 인용은 약간 이상하게 보입니다. –

+0

@Joe : 코드는 PHP입니다. –

+0

해결 방법은 http://stackoverflow.com/questions/1318028/php-different-quotes –

답변

20

Ultimately, what I want, is to be able to make a search for which the search-term is the current page's url, with wildcards before and after.

는 SQL 와일드 카드 문자 백분율 기호입니다. 따라서 :

$variable = curPageURL(); 
$variable = mysql_real_escape_string($variable); 
$query = "SELECT * FROM `tablename` WHERE `columnname` LIKE '%{$variable}%'"; 

참고 : 추가 코드를 추가했습니다. mysql_real_escape_string()은 고의적으로 또는 실수로 SQL 문을 손상시킬 문자를 넣는 사용자로부터 사용자를 보호합니다. 매개 변수가있는 쿼리를 사용하는 것이 더 낫지 만이 간단한 수정보다 더 복잡한 주제입니다.

참고 : 문자열 인용 부호도 수정했습니다. 해당 문자열이 큰 따옴표이고 $query 끝에 따옴표가 누락 된 경우 문자열의 변수 만 직접 사용할 수 있습니다.

편집 2015년 1월 17일 : 그 마음에, 더 이상 mysql_* 기능을 사용하지 마십시오 너무 그냥, upvote에있어. 수동으로

## this code is open for SQL injection attacks 
$query = "SELECT * FROM `tablename` WHERE `columnname` LIKE '$variable'"; 

또는 CONCAT 문자열 : 당신은 구문 오류를 통지하지 않을거야 이유에

## this code is open for SQL injection attacks 
$query = 'SELECT * FROM `tablename` WHERE `columnname` LIKE "' . $variable . '"'; 
+0

감사합니다! 너는 구세주 야, 정말 고마워! 나는 당신의 편집을 보았습니다, 이것은 제가하지 않았던 것입니다! 지금은 잘 작동합니다, 덕분에,이 사이트는 분명히 선호됩니다. – skarama

+1

+1 : 그리고 downvote에 대한 의견을 주셔서 감사합니다. –

+0

나에게 유용했다. 고맙습니다:) – sg552

5

주세요! 이렇게하지 않으면 SQL injection (this is a list of 138 StackOverflow questions you should read, absorb and understand prior to returning to your application)에 취약합니다. 매개 변수가있는 쿼리 또는 저장 프로 시저를 사용하십시오.

+0

나는 이것이 의미하는 바를 모를까 두렵다. ( – skarama

+2

이것은 전혀 도움이되지 않는다.) –

+2

+1 : 누군가가 나쁜 습관에 대해 경고받는 것에 불쾌감을 느꼈다./ –

6

사용 :

,

$query = "SELECT * FROM `tablename` WHERE `columnname` LIKE '{$variable}'" ; 
, 나는 "는 엄마의 악용"제출 위에 취약 할 것 같은, SQL 주입 공격을 방지하는 이유에 대한 아이디어를 얻을 :

alt text

+0

나는 아이디어를 얻지 만, tablename과 columnname은 실제 필드 이름이 아니며, 실제 필드 이름을 변경했습니다. 아니면 내가 잘못 됐어? 그리고 나는 불쾌감을 느끼지 않을 것입니다, 나는 너무 많은 빠른 답변을 얻고 있습니다. – skarama

+0

skarama : 그는 매개 변수를 입력하기 위해 문자열을 사용하여 SQL 쿼리를 만들지 말아야한다는 것을 의미합니다. 그렇게함으로써 사용자는 웹 서버와 동일한 권한으로 데이터베이스에 대한 모든 액세스 권한을 사용자에게 부여하게됩니다. –

+0

@Skarma : SQL 주입 공격의 핵심은 인위적으로 입력하려는 문자열 매개 변수를 인위적으로 종료 한 다음 즉시 악의적 인 것으로 보이는 두 번째 쿼리를 제출한다는 것입니다. 첫 번째 쿼리에서 어떤 일이 발생하든 상관 없습니다. 작동하지 않는 쿼리의 경우 –

1

사용 따옴표 : 오류보고 설정이 올바르게 설정되지 않았을 가능성이 큽니다.

열기 php.ini 다음이 설정되어 있는지 확인합니다 :

display_errors = On 

그리고 :

error_reporting = E_ALL 
0

당신이 변수 값을 대체해야하는 경우

1

코드는 SQL 주입 공격에 취약합니다. 사용자가 제공 한 데이터는 절대로 SQL 쿼리 문자열에 직접 배치하면 안됩니다. 대신, 먼저 mysql_real_escape_string()과 같은 함수를 사용하여 위생 처리해야합니다.