2010-01-26 5 views

답변

-1

왜 Prepared Statement를 사용하고 싶습니까?

SQL 주입 우려가있는 경우 당신은 항상 롤 수있는 자신 만의 :

$fname = "Robert'); DROP TABLE students;--"; 
$lname = "Smith"; 

$pureSql = "SELECT FROM `users` WHERE `fname` = '$fname' AND `lname` = '$lname'"; 
$prepSql = "SELECT FROM `users` WHERE `fname` = :userfname AND `lname` = :userlname"; 

echo $pureSql, "\n"; 
echo prepare($prepSql, array('userfname' => $fname, 'userlname' => $lname)), "\n"; 

function prepare($sql, $params=array()){ 

    if(strlen($sql) < 2 || count($params) < 1){ 
     return $sql; 
    } 

    preg_match_all('/\:[a-zA-Z0-9]+/', $sql, $matches); 

    $safeSql = $sql; 
    foreach($matches[0] as $arg){ 
     if(array_key_exists(ltrim($arg, ':'), $params)){ 
      $safeSql = str_replace($arg, "'" . mysql_real_escape_string($params[ltrim($arg, ':')]) . "'", $safeSql); 
     } 
    } 

    return $safeSql; 

} //prepare() 

출력은 다음과 같습니다 users FROM

SELECT WHERE fname = '로버트'); DROP TABLE 학생 - 'AND lname ='Smith ' SELECT FROM users WHERE fname ='Robert \ '); DROP 표 학생 - 'AND lname ='스미스 '

편집은 다음 XKCD 링크 http://xkcd.com/327/

+0

좋은 아이디어를 잊어 버렸습니다. 그러나 이것은 a) 여전히 서버 쪽 Prepared Statements에 액세스 할 수 없으며 b) 버그가 있습니다 (예 : int 매개 변수 (1)이 인용 된 (''1 '), 엄격한 SQL에서 문제를 일으킬 수 있음). 나는'prepare()'무료 버그를 작성하는 것이 그리 간단하지 않다고 생각한다. –

+1

따옴표를 바꾸는 것만으로도 실제로 악용을 막을 수는 없습니다. 자신이하는 일을 진실로 알지 못하는 한 (예 : Monty)이 일을 시도하지 마십시오. – user999717

+1

좋은 조언처럼 들리지만 확실한 증거가 필요합니다. 이 코드의 취약점을 드러내는 익스플로잇을 보여주십시오. – jckdnk111

관련 문제