2011-10-07 3 views
-4

어떤 쿼리가 더 안전한가요?더 안전한 MySQL 쿼리는 무엇입니까? 2 부

나는 심지어 들었습니다 소금(); 및 md5(); php5의은 mySQL 삽입을 위해 특별히 안전합니다. 심지어이

$customers_email = mysql_real_escape_string(trim(strtolower($_REQUEST['customers_email'])));  
$customers_email = mysql_real_escape_string(($_REQUEST['customers_email'])); 

또는

, 나는 생각 :

$1=$_REQUEST['customers_email']; 
$2=$1; 
$3=$2; 
$4=$3; 
$5=$4; 
$a=$5; 

$xx = mysql_real_escape_string(($a)); 

내 원래 스레드 : https://stackoverflow.com/questions/7633993/php-mysql-select-how-to-make-it-secure

+2

대신 [PDO] (http://php.net/manual/en/book.pdo.php)를 시도하십시오 –

+6

세 번째 접근 방식에서 배정 난제의 근거는 무엇입니까? o_O – Tomalak

+0

@Tomalak, 그것은 많은 눈의 원칙입니다. 데이터가 할당 될 때마다 확인됩니다 :-) – Johan

답변

3

없음 다른 것보다 더 안전합니다. 그 중 하나는 문자열을 모두 소문자로 변환하고 공백을 다듬습니다. 이것은 SQL 인젝션을 막기 위해 아무 것도하지 않습니다. 마지막 검색어는 일반 mysql_real_escape_string($_REQUEST['customers_email']);과 같습니다.

3

이 질문은 많은 많은 시간 전에 요청 받았다.

은 PDO를 사용하는 것이 좋습니다,하지만 당신은 mysql_로 * LIB를 사용하는 경우, 다음과 같이 그것을 :

이 매개 변수에 대한 이스케이프
다음 코드 보안 100 % :

$var = mysql_real_escape_string($_POST['var']); 
$query = "SELECT * FROM table1 WHERE afield = '$var' " 
// You must quote your $vars    ^^
// failure to do so defeats the escaping and causes syntax errors. 

코드 SQL 주입을 동일하게 수행 할 필요가 없습니다.

안전하지 않은, 이것은 당신이 데이터베이스, 테이블 및 열을 확인할 필요가 작동하지 않습니다

$afield = mysql_real_escape_string('$_POST['var']); 
$query = "SELECT * FROM table1 WHERE `$afield` = 1 " 
//You can only use escaping for values, never for dynamic SQL. 

작동하지 않습니다


이 코드는 동적 열/테이블 이름을 이스케이프 화이트리스트에 대한 이름. 해싱 및
당신은 암호를 소금에 절인 해시를 사용 염장에 대해 동적 SQL

$allowed_fields = array('field1', 'field2'); 
$afield = $_POST['afield']; 
if (in_array($afield, $allowed_fields)) { 
    $query = "SELECT * FROM table1 WHERE `$afield` = 1"; 
} 

에 대한

100 % 안전.
암호화되지 않은 암호를 데이터베이스에 저장하는 대신 해시 된 암호를 저장하는 것이 좋습니다.
무지개 테이블을 물리 칠려면 해쉬를 다른 세미 무작위 소금으로 소금을 만들어야합니다. 소금은 비밀 일 필요가 없으며 단지 무작위적일 필요가 있습니다.

//To add a user. 
INSERT INTO users (name, salt, passhash) 
VALUES ('$username', '$salt', SHA2(CONCAT('$salt','$password'),512)); 

//To check a password: 
SELECT u.id FROM users u 
WHERE u.name = '$username' 
    AND passhash = SHA2(CONCAT(salt, '$password'),512); 

//To change a password: 
UPDATE users u SET passhash = SHA2(CONCAT(s.salt, '$newpassword'),512) 
WHERE u.id = (SELECT u2.id FROM (
    SELECT u1.id FROM users u1 
    WHERE u1.name = '$username' 
    AND passhash = SHA2(CONCAT(u1.salt, '$oldpassword'),512) u2) s 

도 참조 : 쿼리의
How to prevent SQL injection with dynamic tablenames?
How does the SQL injection from the "Bobby Tables" XKCD comic work?
How can I prevent SQL injection in PHP?

+0

이것을 작성해 주셔서 감사합니다. 정말로 감사 드리며 그런 활기찬 지역 사회에 도움이되기를 바랍니다. 이 장소는 포럼보다 활동적입니다. – TheBlackBenzKid

2

각각의 첫 번째 접근 방식은 mysql_real_escape_string 기능을 사용하기 때문에 서로 안전합니다. SQL 삽입은 문자열에 추가 인용 부호를 추가하여 조건을 깨뜨리는 방식으로 쿼리를 '중단'함으로써 작동합니다.

고려 : 공격자가 ' OR 1=1 --의 이메일을 제출한다면

$email = $_GET['email']; 
$sql = "SELECT * FROM users WHERE email='$email'"; 

문자열 보간 후 쿼리가 될 것입니다 :

이 경우
$sql = "SELECT * FROM users WHERE email='' OR 1=1 -- '"; 

는, MySQL은 이중 대시 주석입니다 우리의 원래 오른쪽 인용 부호를 주석. mysql_real_escape_string을 실행하면 데이터베이스 엔진이 전자 메일 문자열을 올바르게 이스케이프하여 쿼리에서 '분쟁'을 방지 할 수 있습니다.

각 데이터베이스 엔진의 정확한 이스케이프 스타일이 서로 다르기 때문에 각 엔진마다 고유 한 이스케이프 기능 집합이 있습니다. 이러한 이유로 PDO를 사용하고 여기에서 다른 사람들이 언급 한 바와 같이 준비된 진술로 전환하는 것이 현명 할 것입니다.

이 내용이 조금 더 설명되기를 바랍니다.

+0

당신의 대답은 불완전합니다, 도피가 충분하지 않습니다, 당신은 또한 질문에 주입 된 $ vars를 인용해야합니다 또는 여전히 안전하지 않습니다. – Johan

+0

@Johan 입력 해 주셔서 감사합니다. 적절하게 수정하겠습니다. 확인하기 만하면 쿼리에서'... where email = '$ escapedEmail'... '이 필요합니다. – cgwyllie

관련 문제