2011-12-20 5 views
0

У меня есть класс Controller_Core, который ничего не делает на данный момент, но когда я хочу централизовать некоторый общий код, я могу его поместить.Защита данных от центральной точки (ядро контроллера)?

Мне интересно, можно ли работать наоборот, если у кого-то есть класс, который простирается от Controller_Core. Допустим, у обычного пользователя есть класс Controller_User. В этом классе я хотел бы автоматизировать добавление слэшей к предоставленным параметрам из каждой функции этого класса. Возможно ли это без объявления функции foo в Controller_Core, которая делает что-то вроде mysql_real_escape_string?

Другими словами, возможно ли использовать параметры auto-mysql-real-escape из метода в классе (ny)?

Используемый язык - это PHP.

-Обновление

Давайте предположим, что у меня есть этот код:

class Controller_User extends Controller_Core 
{ 
    public function Login($sUsername, $sPassword) 
    { 
    # the add-slashes action should be done automatically at this point without calling a specific for such functionality (thus; $sUsername and $sPassword should be 'add-slashed' from RunFromEachCalledExtendedFunction) 
    $bValidationResult = // some further code 
    return $bValidationResult; 
    } 
} 

class Controller_Core 
{ 
    public function RunFromEachCalledExtendedFunction 
    { 
    # some code to determine which method was called, then add-slash those parameters 
    } 
} 

$oControllerUser = new Controller_User(); 
$bLoginResult = $oControllerUser->Login("my username' OR 1=1", "my pwd"); 
+0

Возможно: Да. Должны ли вы это сделать? *Конечно нет*. Пожалуйста, прекратите использовать ветхое расширение mysql. Если вы пишете OO-код, вы должны использовать современную библиотеку баз данных. Попробуйте PDO или mysqli. – Charles

+0

Или любая эквивалентная функция для выполнения таких задач. Затем; как я могу выполнить автоматический вызов Controller_Core из любого расширенного метода без автоматического вызова '$ this-> MethodName()' – Ben

+0

Можете ли вы разместить код примера, пожалуйста? Что у вас есть и что вы хотите, чтобы иметь возможность? Я не уверен, что понимаю. – Charles

ответ

0

Вы не должны экранировать данные только в один конкретный контроллер, но во всех ваших запросов!
Если вы действительно хотите перестать беспокоиться о том, что SQL-инъекция использует PDO.

Если вы настаиваете на использовании mysql_query - создайте/используйте оболочку класса базы данных и используйте функцию mysql_real_escape_string во всех методах выполнения запросов. Что-то вроде этого:

DB::select()->from('table')->where('field1', '=' $param1); 

где() метод будет использовать mysql_real_escape_string функцию.

+0

Я согласен, что в моих (собственных) моделях фреймворка (и, следовательно, db-данных) можно получить доступ только от контроллеров. С этой точки зрения я хочу достичь заданного;) – Ben

Смежные вопросы