2013-02-15 4 views
3

우리 모두 알고 있듯이 Yii와 같은 프레임 워크에서는 원시 MySQL 쿼리를 사용할 수 없습니다. Yui 프레임 워크에서 실행되는 프로젝트에서 사용자 입력에서 SQL 주입을 피하기 위해 mysql_escape_string을 사용하고 싶습니다.Yii 프레임 워크에서 mysql_escape_string()을 사용하는 방법은 무엇입니까?

mysql_escape_string은 PHP 5.5에서 더 이상 사용되지 않으며 PDO 대안이 있음을 알고 있습니다. Yii 프레임 워크의 대안과 mysql_escape_string()의 PDO 방식은 무엇입니까?

+3

데이터베이스 작업을 위해 Yii 설명서를 읽으려고 했습니까? http://www.yiiframework.com/doc/guide/1.1/en/database.dao, http://www.yiiframework.com/doc/guide/1.1/en/database.query-builder – deceze

+1

당신은하지 않습니다. 매우 제한된 경우를 제외하고는 PDO에서 탈출하십시오. 자리 표시자를 사용하여 준비된 문을 사용합니다. 이스케이프가 필요 없음 –

+0

downvotes는 mysql_escape_string이 "SQL injection protection"과 동의어라고 생각하는 대부분의 PHP 사용자가 혼동을 일으킴으로써 발생합니다. OP가 후반기를 사용했다면, 그들은 downvotes을 얻지 않을 것이다. –

답변

6

PDO에서 mysql_escape_string의 대안은 prepared statements를 사용하고 있습니다. 예를 들어 YII에서 : 당신은 준비된 성명에서 자리를 통해 매개 변수를 전달할 때 SQL 주입에 대해 당신을 확보하는

합니다 (YII 참조 문서 http://www.yiiframework.com/doc/api/1.1/CDbCommand에서)

$user = Yii::app()->db->createCommand() 
    ->select('username, password') 
    ->from('tbl_user') 
    ->where('id=:id', array(':id'=>$_GET['userId'])) 
    ->queryRow(); 

.

+0

그러나 어떤 경우에는 작동하지 않습니다 : 일치에서 ... – Roel

3

사용 CHTMlPurifier :

// Example 
$p = new CHtmlPurifier(); 

$user = Yii::app()->db->createCommand() 
    ->select('username, password') 
    ->from('tbl_user') 
    ->where('id=:id', array(':id'=>$p->purify($_GET['userId']);)) 
    ->queryRow(); 

그것은 GET 매개 변수에 악성 코드를 추가 할 수 있습니다.

+0

'purify'를 호출하지 않으면 코드에 어떤 취약점이 있습니까? – Joni

+1

@ Joni : 보안 결함 : XSS, 쿠키 도용 등 – FabianoLothor

2

준비된 쿼리 '?'를 사용하여 쿼리 매개 변수를 이스케이프 처리합니다. 자리 표시 자에는 단점이 있습니다 (이스케이프 된 매개 변수가 쿼리 본문에서 멀리 이동하여 일부 쿼리를 사용하기가 더 어려워 지므로 데이터베이스에 대한 왕복이 항상 필요하지는 않지만, 쿼리가 본질적으로 동적 인 경우 그것들을 많이 준비하면 실제로 서버 리소스를 취할 수 있습니다).

Yii에는 준비된 쿼리 양식 외부에서 쿼리 매개 변수를 이스케이프 처리하는 데 사용할 수있는 quoteValue 메서드가 있습니다.

-1

ActiveRecords을 사용하는 경우 매개 변수를 이스케이프 할 필요가 없습니다. 당신이 mysql_escape_string 기능을 사용하려면

그러나, 당신은 모델 일 경우 성능 문제가 있었을 것입니다 매우 복잡한 쿼리를 실행할 때 나는 Yii로 이것을 사용했습니다 mysqli_escape_string()

으로 시도 할 수 있습니다 내가 실행하는 데 필요한 SQL은 DB에 직접 쿼리합니다.

이렇게하려면 Yii::app()->db->createCommand($sql)->queryAll() (또는 다른 유사한 기능)을 사용할 수 있습니다.

관련 문제