mysqli 라이브러리가 아닌 mysql 라이브러리를 사용하여 PHP와 MySQL로 준비된 명령문을 작성할 수 있는지 알고 싶습니다.mysqli를 사용하지 않고 PHP와 MySQL로 준비된 문
PHP 설명서에서 아무것도 찾을 수 없습니다.
감사합니다.
mysqli 라이브러리가 아닌 mysql 라이브러리를 사용하여 PHP와 MySQL로 준비된 명령문을 작성할 수 있는지 알고 싶습니다.mysqli를 사용하지 않고 PHP와 MySQL로 준비된 문
PHP 설명서에서 아무것도 찾을 수 없습니다.
감사합니다.
PHP의 문서 quite clearly statesmysql
extension하지 지원 제표를 작성 한다는 것을 (해당 페이지의 끝). 준비된 문을 지원하는 mysqli
의 대안은 PDO_MYSQL
입니다.
왜 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/
좋은 아이디어를 잊어 버렸습니다. 그러나 이것은 a) 여전히 서버 쪽 Prepared Statements에 액세스 할 수 없으며 b) 버그가 있습니다 (예 : int 매개 변수 (1)이 인용 된 (''1 '), 엄격한 SQL에서 문제를 일으킬 수 있음). 나는'prepare()'무료 버그를 작성하는 것이 그리 간단하지 않다고 생각한다. –
따옴표를 바꾸는 것만으로도 실제로 악용을 막을 수는 없습니다. 자신이하는 일을 진실로 알지 못하는 한 (예 : Monty)이 일을 시도하지 마십시오. – user999717
좋은 조언처럼 들리지만 확실한 증거가 필요합니다. 이 코드의 취약점을 드러내는 익스플로잇을 보여주십시오. – jckdnk111