2013-02-11 1 views
0

명!준비된 문에서의 동적 인수

이 쿼리는 WHERE 인수를 $_POST에서 가져옵니다. 것은 각 값에 대한 쿼리를 만들지 않고 두 비교 값을 동적으로 가져 오려고합니다. 내가 지금 가지고 있습니다 :

$what = $mysqli->real_escape_string($_POST['what']); 
........ 
$query = "SELECT * FROM list WHERE "; 
$query .= $what . " = ? LIMIT 0,10"; 
........ 
$stmt->bind_param('s', $what); 

내 첫 번째 질문 : 이 실제로 얼마나 안전합니까? 다른 매개 변수를 바인딩 할 수 없기 때문에 같은 것을 관리 할 수있는 더 좋은 방법이 있습니까?

두 번째 문제점은 다음과 같습니다. = ?LIKE %?%으로 변경하고 싶지만 제대로 작동하지 않습니다. 내가 CONCAT('%', ?, '%') (나 아는 것)을 사용해 보았지만 여전히 작동하지 않습니다. 기본적으로 내가 달성하고자하는 것은 : WHERE ? LIKE %?%입니다. 가능한가? 이걸 조금 도와 줄 수 있니?

환호, 알렉스

+1

이것은 안전하지 않으며 허용 된 사이트 목록을 사용합니다. – MarcDefiant

+0

SQL 삽입을 피할 수 있다고해도 테이블에 존재하는 열을 지속적으로 확인하지 않고도 (존재하지 않는 열을 넣기 때문에) 데이터베이스에 대한 쿼리를 위반하는 사람을 피할 수는 없습니다. 제안 된 화이트리스트. –

+0

try :'WHERE .. LIKE? '그리고 나서'bind_param ('s ','% test % ')' – bitWorking

답변

0

mysql_real_escape_string 또는 유사한 함수가 백틱 (`)을 벗어나지 않으므로 응용 프로그램이 SQL 삽입에 취약합니다.

모든 열이있는 흰색 목록을 정의하고 열이 배열에 있는지 확인하기 만하면됩니다.

LIKE %?% 이후를 검색하려면 검색 용어 앞뒤에 %을 붙이기 만하면됩니다. 적절한 탈출 방법은 다음을 참조하십시오. Escaping MySQL wild cards

+0

화이트리스트는 방법입니다. 답장을 보내 주셔서 감사합니다. – vulkoingim

0

그냥 매개 변수의 엄격한에 $where을 확인하십시오 그래서 더 키 당신의 세트처럼 테이블 이름과 연관 배열을 사용 O(N) 복잡성에서 실행되는

if (!in_array($where, array("table1", "table2"))) { 
    //do smth with wrong parameter 
} 

in_array 것을 매개 변수가 큽니다.

+0

고맙습니다. – vulkoingim

-1

동적 쿼리를 수행 할 수 있지만 웹 사이트는 SQL 삽입에 취약합니다.

-1

mysql_real_escape_string 이스케이프 백틱을 수동으로 이스케이프 처리 할 수 ​​있습니다.
도피하는 모든 것을 도우미 라이브러리로 옮기는 것도 좋은 생각입니다. 따라서 데이터를 두 줄로 가져와야합니다.

$sql = "SELECT * FROM list WHERE ?n = ?s LIMIT 0,10"; 
$data = $db->getAll($sql, $_POST['what'], $_POST['where']);