2011-08-29 6 views
1

작은 따옴표 사용시 차이점이 있습니까? 전체 SQL 쿼리를 큰 따옴표로 묶어서 사용 하시겠습니까?PHP - SQL 쿼리를 작은 따옴표 나 큰 따옴표로 묶으시겠습니까?

어느 것이 더 낫다 : (작은 따옴표 포함)

이 방식 :

$username = mysql_real_escape_string($username); 
    $password = mysql_real_escape_string($password); 

    $sql = 'SELECT * FROM users WHERE username = "' . $username . '" AND password = "' . $password . '" LIMIT 1'; 

?

또는이 접근

(따옴표 사용) :

$username = mysql_real_escape_string($username); 
    $password = mysql_real_escape_string($password); 

    $sql = "SELECT * FROM users WHERE username = '{$username}' AND password = '{$password}' LIMIT 1"; 

이 작업을 수행 할 수있는 더 좋은 방법이 있나요?

나는 항상 PHP에서 작은 따옴표를 선호하므로 첫 번째 접근 방식을 좋아합니다. 그래서 전체 SQL 쿼리를 작은 따옴표로 묶어서 사용하는 것이 좋으며, 변수 나 데이터 주위에 큰 따옴표를 사용하는 것이 좋으며 크로스 플랫폼이며 MySQL 이외의 데이터베이스에서도 사용할 수 있습니다.

+0

실수 일 수 있지만 보간 (두 번째 방법)이 연결 (첫 번째)보다 빠릅니다. – Phil

+3

[SQL 주입 공격] (http://xkcd.com/327/)의 영향으로 인해 권장되지 않습니다. . PDO 또는 준비된 진술을 적극 권장합니다. –

+0

@OMG Pony : 'mysql_real_escape_string'을 사용하고 있습니다 만? – icktoofay

답변

9

이러한 접근 방식 중 하나 대신 PDO을 사용하십시오. 문자열 대신 매개 변수를 사용할 수 있습니다.

$sth = $dbh->prepare('SELECT * FROM users WHERE username = :username AND password = :password LIMIT 1'); 
$sth->bindParam(':username', $username, PDO::PARAM_STR); 
$sth->bindParam(':password', $password, PDO::PARAM_STR); 
$sth->execute(); 

한편 암호는 일반 텍스트로 동시에 사용하지 않아야합니다.

+0

답변 해 주셔서 감사합니다. 한 가지, "같은 시간에 일반 텍스트로 암호를 사용하지 않도록하십시오"라는 의미는 무엇입니까? 나는 너가 의미하는 것을 얻을 수 없다 (어쩌면 내가 너무 졸 았기 때문에 내 뇌가 거의 생각을 멈췄다!). – XO39

+1

@Amir Raminfar : 링크를 편집 해 주셔서 감사합니다. – XO39

+0

@ XO39, 당신이 보낸 샘플은 사람들이 입력하는 것과 같은 방식으로 암호를 저장하고 있음을 암시합니다. 이것은 나쁘다! 암호는 일반 텍스트로 저장하면 안됩니다. 항상 소금으로 단방향 암호 함수를 전달해야합니다. 따라서 누군가 데이터베이스에 액세스하면 모든 곳의 모든 계정에 대한 액세스 권한을 부여하지 않은 것입니다.참조 : http://stackoverflow.com/questions/1581610/how-can-i-store-my-users-passwords-safely – acrosman

3

둘 다 똑같이 무시 무시합니다. :) mysql_real_escape_string에 대해 들어 본 적이없고 PDO를 acrosman으로 사용하는 것을 잊어라. 특히 준비 문을보십시오 : http://www.php.net/manual/en/pdo.prepare.php. 이것은 "크로스 플랫폼이며 MySQL 이외의 데이터베이스에서도 사용할 수 있습니다!"라고 말하면서 특히 중요합니다. 저크로서 벗어나려고하지는 않지만 힌트 : mysql_로 시작하는 메소드를 호출하는 코드는 크로스 플랫폼이 아닌 probabl입니다. 그러나 PDO를 사용하면 이므로 Mysql 이외의 데이터베이스를 사용할 수 있습니다. 물론, SQL의 다른 맛에 대한 명백한주의 사항이 있지만 적어도 매개 변수화 된 쿼리를 사용하면 이스케이프해야하는 문자열의 맛이 다릅니다.

관련 문제