Параметры динамического запроса и безопасности - PullRequest
0 голосов
/ 22 октября 2011

Я сделал простой и тонкий слой базы данных, чтобы помочь мне в нормальной работе. Теперь, когда он работает, я решил изучить его с точки зрения безопасности. Первый удар ( с помощью Мордреда ) был моим динамическим запросом. Первая проблемная переменная для таблицы была легко решена путем проверки табличной переменной по фиксированному регулярному выражению:

$regex = '/^[a-zA-Z0-9_$]+$/';

Теперь следующая переменная для санации / проверки - это имена столбцов, и AFAICS - у меня есть два варианта. Сначала извлекаются все столбцы в этой таблице и создается белый список или снова используется регулярное выражение для проверки переменной столбца. Мой вопрос в том, какой из вышеперечисленных способов выбрать? Хорошо ли использовать проверку регулярного выражения для имени таблицы? Ниже приведен пример строки SQL, о которой я говорю

$stmt= $this->conn->prepare("SELECT * FROM $table WHERE $id_col[0]=:id");            
$stmt->execute(array(":id"=>$id_val[0]));
$this->resultset = $stmt->fetch(PDO::FETCH_ASSOC);  

Надеюсь услышать от вас, друзья (извините, если на этот вопрос ответили где-то. Я не смог найти ничего подобного!)

Ответы [ 2 ]

1 голос
/ 20 декабря 2011

Я создал сценарий, который сканирует все таблицы и создает белый список для имен и столбцов таблиц, а затем я использую его для проверки любого пользовательского ввода, которое должно быть именем таблицы / столбца, поскольку они не входят в параметрический запрос. Все остальное параметрируется через PDO Bind!

0 голосов
/ 21 декабря 2011
function escapeIdent($str) {
  return "`".str_replace("`","``",$str)."`";
}

Тем не менее, я бы посоветовал не избегать, а делать такой большой белый список из другого ответа.

Белый список должен быть не для всего сайта, а для конкретного утверждения, для которого он используется.

Хотя имя поля, предоставленное пользователем, может не содержать код для инъекции, оно все равно может представлять некоторую опасность.

Скажем, если злоумышленнику удалось заменить какое-нибудь безобидное имя поля, например surname, более важным, например access level, он может получить права администратора на сайте.

...