2014-05-22 1 views
0

첫 번째 sql 문만 실행하도록 PHP pdo execute()를 제한하는 방법이 있습니까?php pdo execute()를 첫 번째 sql 문 실행으로 제한

모든 고객을 반환합니다

SELECT * FROM customer;DROP TABLE invoice

을 실행하는 예를 들어

뿐만 아니라 송장 테이블을 삭제합니다.

나는 사용자로부터 전체 SQL 문을 필요로하지만 SELECT와 추가 항목이 없어야합니다.

이 예는 악의적으로 입력 될 수있는 많은 예 중 하나입니다. 추가 DROP, UPDATE, DELETE 문 등을 포함 할 수 있습니다.

준비된 명령문은? s를 값으로 간단하게 바꿉니다. 그것은 위험한 SQL statemets이 전달되는 것을 막지 않습니다.

첫 번째 SQL 문만 실행하도록 PHP pdo execute()를 제한하는 방법이 있다면 문제가되지 않습니까?

+0

을 방지하기 위해이 같은 것을 사용할 수 있습니다

? 그리고 주입에 대해 걱정이된다면 PDO의 Prepared 문은 특별히 –

+0

을 처리 할 것입니다. 쿼리에 drop 쿼리가 포함되어 있으면 삭제하고, 일부 쿼리에이 쿼리가 있으면'preg_replace ("/ (. *?) DROP (. *)/","$ 1 ","SELECT * FROM customer; DROP TABLE 인보이스 ");'해당 쿼리에 drop 쿼리가 있으면 삭제합니다. –

+0

@ user790454 - 하위 문자열을 선택하면 실패 할 수 있습니다. 또는 단어 drop을 포함하는 부분 문자열을 삽입하십시오. – Scopey

답변

0

SQL 삽입을 막으려면 prepare 문이 처리 할 수 ​​있습니다. 당신이 그것을 필요로하지 않는 경우에 당신은 왜 당신이 거기에 그 진술을 둘 것입니다 SQL 주입을

$stmt = $db->prepare("SELECT * FROM table WHERE id=? AND name=?"); 
$stmt->bindValue(1, $id, PDO::PARAM_INT); 
$stmt->bindValue(2, $name, PDO::PARAM_STR); 
$stmt->execute(); 
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC); 
+0

답장을 보내 주셔서 감사합니다. 그러나 실제로는?를 값으로 바꾸는 것이 아닙니다.그것은 사용자가 아니라 값을 SQL 문자열을 받아 들일 필요가있는 경우입니다, 그것은 SELECT 문이어야하며 그렇지 않으면 시스템에 손상을 줄 수 있습니다. 이 경우에 – user1397366

+1

키워드 블랙리스트가 필요하거나 간단히 DB prevellage를 변경하여 테이블을 삭제할 수 없도록하십시오. – Saqueib