php mysql адодб

Я использую PHP с adodb, но столкнулся с серьезной проблемой. Я использую adodb для ускорения разработки, поэтому я могу делать такие вещи, как:

$r["Name"] = $_POST['txtName'];

if ($_POST["ID"] != "")
  $conn->AutoExecute("content", $r, 'UPDATE', 'AutoID = ' . $_POST["ID"]);      
else
  $conn->AutoExecute("content", $r, 'INSERT');

Однако, если это имя должно было иметь одинарную кавычку, оно сохраняется в БД с косой чертой! Итак, если имя Testimonial, оно будет сохранено как Testimonial, что вызывает у меня огромные проблемы, в любом случае я могу избежать этого, но все же программировать, как указано выше, поскольку это чертовски намного быстрее, чем подготовка операторов вставки/обновления.

Ваше здоровье


person Shane    schedule 24.11.2010    source источник
comment
Это делается для того, чтобы вы не получили взломанную/сломанную базу данных. Мой совет - оставить так в БД и исправить на выходе.   -  person DampeS8N    schedule 24.11.2010
comment
Вероятно, у вас включены magic_quotes. Попробуйте phpinfo() выяснить, так ли это   -  person Pekka    schedule 24.11.2010
comment
@Дампе нет. Если косые черты действительно попадают в базу данных, что-то сломано   -  person Pekka    schedule 24.11.2010
comment
@Pekka: я подумал, что этим занимается ADO. Но вы, вероятно, правы насчет magic_quotes.   -  person DampeS8N    schedule 24.11.2010


Ответы (2)


Правильное и окончательное решение этого вопроса состоит из двух частей:

  1. Отключите все magic_quotes программно в своем коде. Это гарантирует, что у вас есть известная конфигурация для работы, которую нельзя сломать, если/когда администратор изменит эти настройки php.ini.
  2. Проверяйте/цитируйте все входящие пользовательские данные перед доступом к базе данных!

В то время как первая часть — это хорошее программирование, вторая абсолютно необходима для написания безопасного приложения!

Чтобы процитировать пользовательский ввод, вы можете пойти двумя путями:

  1. Вручную (используйте qstr или Quote), в этом случае вы должны очень-очень осторожно, чтобы ничего не пропустить. Это может быть вполне выполнимо для небольших проектов, я много раз шел по этому пути в прошлом.
  2. Используйте подготовленные операторы со связанными переменными для создания запросов. Это гарантирует, что в вашем приложении никогда не будет SQL-инъекций, если вы правильно укажете типы переменных, и это намного менее подвержено ошибкам, чем первый вариант. Это то, что я делаю в течение некоторого времени.

Обновление:

Если вы используете подготовленные операторы, вы можете обнаружить, что AdoDB не покупает вас так много, и вы можете использовать PDO для большей части работы. Когда вам нужно что-то «автомагическое», вы можете сами написать несколько функций, специфичных для приложения. По моему опыту, это немного больше работы и в целом лучше, чем включение AdoDB.

person Jon    schedule 24.11.2010
comment
Привет, спасибо за это .. Знаете ли вы подходящий класс проверки, чтобы убедиться, что пользовательский ввод чист? - person Shane; 24.11.2010
comment
Отредактировал мой ответ, пожалуйста, посмотрите. При проверке вручную вы также можете использовать более удобный intval() для целочисленного ввода (например, идентификаторы записей БД), который, вероятно, используется в большинстве случаев. - person Jon; 24.11.2010

Спасибо за вклад, я решил включить магические кавычки во время выполнения с помощью этой функции:

if (get_magic_quotes_gpc()) {
    function stripslashes_gpc(&$value)
    {
        $value = stripslashes($value);
    }
    array_walk_recursive($_GET, 'stripslashes_gpc');
    array_walk_recursive($_POST, 'stripslashes_gpc');
    array_walk_recursive($_COOKIE, 'stripslashes_gpc');
    array_walk_recursive($_REQUEST, 'stripslashes_gpc');
}

Однако тогда это склонно к SQL-инъекциям?

person Shane    schedule 24.11.2010
comment
Да, если вы не используете подготовленные операторы для всех ваших запросов. Посмотрите на мой ответ. - person Jon; 24.11.2010