Это безопасно?ADOdb подготовил заявления - PullRequest
4 голосов
/ 30 июля 2011

Я использую ADOdb для подключения к моей базе данных MSSQL. Мне интересно, это достаточно хорошо, чтобы предотвратить внедрение SQL?

Я использую подготовленный запрос:

       $db = ADONewConnection('odbc_mssql');
       $dsn = "Driver={SQL Server};Server=SERVNAME;Database=DBNAME;";
       $ADODB_COUNTRECS = false;

       $db->Connect($dsn,'LOGIN','PASS');

       $sql = 'SELECT login, etc FROM users WHERE login ='.$db->Param('0').' AND pass ='.$db->Param('1').'';
       $stmt = $db->Prepare($sql);  
       $stmt = $db->Execute($stmt,array("$user_id","$psw"));

ИЛИ, возможно, вы бы порекомендовали перейти на PDO?

1 Ответ

7 голосов
/ 06 ноября 2011

Я не понимаю, почему никто не пытался ответить на этот вопрос или даже комментировать. ТАК работает загадочным образом, я думаю ...;) Во всяком случае, я исследовал достаточно (я так думаю), чтобы иметь возможность ответить на это сам, с определенной степенью уверенности.

Так что, по сути, подготовленные запросы намного безопаснее, чем просто экранирование ввода, например mysql_real_escape_string();, потому что, как говорили некоторые мудрые люди:

Да, mysql_real_escape_string - фактически просто функция экранирования строки. Это не волшебная пуля. Все, что он будет делать, это экранировать опасные символы, чтобы их можно было безопасно использовать в одной строке запроса. Однако, если вы не очистите свои входные данные заранее, вы будете уязвимы для определенных векторов атаки.

Ссылка на полный ответ: mysql_real_escape_string

Итак, что я сделал для проверки моего подготовленного утверждения против экранирования - я сделал простую форму отправки и попытался очистить входные данные с помощью mysql_real_escape_string();, и, конечно, это не удалось с примерами типа "1 OR 1=1", некоторые люди предложили добавить экранированные значения внутри одинарных кавычек:

$ query = "SELECT * FROM mydb WHERE ID = '". $ EscapedID. "'";

Это помогает предотвратить пример "1 OR 1=1", но, безусловно, это не лучшая практика. Проблема с экранированием заключается в том, что он не защищает от людей, которые изменяют логику вашего запроса злонамеренным образом.

Так что теперь я буду придерживаться подготовленных заявлений ADODB. Как в моем исходном вопросе выше или более короткая версия bobby-tables веб-сайт:

   $dbConnection = NewADOConnection($connectionString); 
   $sqlResult =  $dbConnection->Execute( 
   'SELECT user_id,first_name,last_name FROM users WHERE username=? AND password=?'
   , array($_POST['username'], sha1($_POST['password']) );

Другие очень полезные вопросы, касающиеся SQL-инъекций:

Также посмотрите это видео, оно значительно упрощает понимание SQL-инъекций:

...