|
|
|
| Добрый вечер, коллеги.
Написал небольшую функцию, для автоматической обработки MySQL-запросов. Осталось дело за малым. Нужно, чтобы передаваемые в неё переменные, автоматически обрабатывались mysql_real_escape_string.
Вот смотрите.
В функцию я передаю запрос:
<?php
$_GET [ 'getName' ] = 'A';
$create = mysqlQuery ( array ( 'insert' => 'INSERT INTO `table` SET `name` = "'.$_GET [ 'getName' ].'"' ) );
?>
|
В функции это будет обрабатываться так:
<?php
function mysqlQuery ( $vars )
{
// ..
elseif ( $vars [ 'insert' ] ) return mysql_query ( ' '.trim ( $vars [ 'insert' ] ).' ' );
// ..
}
?>
|
На $_GET [ 'getName' ], конечно, должна наложиться обработка:
<?php
$_GET [ 'getName' ] = mysql_real_escape_string ( $_GET [ 'getName' ] );
?>
|
Какие у вас есть идеи? | |
|
|
|
|
|
|
|
для: Yaeaeo
(18.11.2012 в 23:52)
| | Используйте подготовленные запросы.
В них не нужно ничего проверять. За вас это сделает драйвер.
Наиболее распространенный на данный момент интерфейс для этого (и в целом для работы с БД) - PDO
Конкретно PDO::prepare() | |
|
|
|
|
|
|
|
для: Sfinks
(19.11.2012 в 01:15)
| | Даа, спасибо. Как-то пока сложно очень, а с английским так вообще пока сути не понимаю. В примерах даже пока не разобрался. Поищу русские инструкции. Одно пока, надеюсь, правильно понял > синтаксис изначальный для построения SQL-запросов точно нужно будет менять всюду? | |
|
|
|
|
|
|
|
для: Sfinks
(19.11.2012 в 01:15)
| | А нельзя ли тогда внедрить собственный синтаксис, как вариант?
Например, выражение:
'INSERT INTO `table` SET `name` = "'.$_GET [ 'getName' ].'"'
|
Записывать как:
'INSERT INTO {|table|} SET {|name|} ==> {|'.$_GET [ 'getName' ].'|}'
|
В данном случае, даже если злоумышленник попробует написать что неладное в $_GET [ 'getName' ], оно всё равно не будет соответствовать нужному синтаксису и не сработает.
А если он всё же узнает, какой именно используется синтаксис, тогда можно для переменных создать обработку:
<?php
$_GET [ 'getName' ] = str_replace ( '{|' , '' , $_GET [ 'getName' ] );
$_GET [ 'getName' ] = str_replace ( '|}' , '' , $_GET [ 'getName' ] );
$_GET [ 'getName' ] = str_replace ( '==>' , '' , $_GET [ 'getName' ] );
?>
|
Вариант? | |
|
|
|
|
|
|
|
для: Yaeaeo
(19.11.2012 в 10:47)
| | Можно, только вместо {|name|} используйте :name, тогда глазом моргнуть не успеете, как ваш код станет совместим с PDO ;-)
На худой конец посмотрите в сторону sprintf() - это все-таки будет ближе к профессиональному подходу, чем создание собственных плейсхолдеров для SQL-запросов. SQL и так довольно сложен, введение еще одного подъязыка для обработки SQL-запросов - это перебор. | |
|
|
|
|
|
|
|
для: cheops
(19.11.2012 в 21:58)
| | Всё равно, получается, даже если с помощью sprintf, у меня должны быть заранее определённые шаблоны запросов? Верно? | |
|
|
|
|
|
|
|
для: Yaeaeo
(20.11.2012 в 01:04)
| | У sprintf() свой "шаблон", который знаком миллионам разработчиков (и не только на PHP), так как функция очень древняя, еще C-шная. | |
|
|
|
|
|
|
|
для: cheops
(20.11.2012 в 07:22)
| | Спасибо. Буду разбираться. | |
|
|
|