2016-04-20 2 views
0

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

код, который SQL инъекции:

if(isset($_GET['delete']) && (int)$_GET['delete'] && is_numeric($_GET['delete'])){ 
    $query = $handler->query('SELECT * FROM portfolio WHERE id =' . $_GET['delete']); 
} 
else{ 
    echo'Error'; 
} 

Будет ли SQL запрос безопасности от инъекции из-за if заявления вокруг него или есть еще какой-то способ впрыскивания?

Это чисто для исследования, и это, очевидно, не в реальном реальном веб-сайте.

Вот как выглядит код, когда он готов, чтобы показать, что я не вопросом, как приготовить:

if(isset($_GET['delete']) && (int)$_GET['delete'] && is_numeric($_GET['delete'])){ 
    $query = $handler->prepare('SELECT * FROM portfolio WHERE id = :id'); 
    $query->execute([ 
     ':id' => $_GET['delete'] 
    ]); 
} 
else{ 
    echo'Error'; 
} 
+0

Id сказать, что вы можете пропустить условие, если используете параметризованный запрос. Отправка, т. Е. Строка в вашей переменной get приведет только к несоответствующим строкам – JimL

ответ

1

Да, именно этот фрагмент кода является безопасным.

Интересно, какое полезное заключение вы можете извлечь из этого ответа.

Кроме того, чтобы ответить на некоторые ваши заявления.

вы должны подготовить все SQL заявления, где пользователь имеет влияние,

Это одна из худших заблуждений, связанных с проблемой инъекции SQL. На самом деле, вы считаетесь безопасным только в том случае, если все 100% ваших запросов заданы параметрами, и вы никогда не беспокоитесь о том, имеют ли данные, с которыми я имею дело, один из них, на который влияет пользователь.

, но вы обрабатываете ошибки по-разному.

Это обращение никогда не должно быть связано друг с другом. Если вы хотите проверить входные параметры - это хорошая идея. Но отнюдь не ваш код обработки SQL должен зависеть от результата такой проверки. Это просто разные вопросы. И в правильно организованном коде ваша проверка входных параметров никогда не сидит в одном файле с кодом обработки SQL. И последний ничего не знает о факте проверки. Или любые изменения, которые были сделаны для такой проверки (например, сначала разрешалось только числовое число, а затем было изменено, чтобы принять произвольную строку). Код обработки SQL должен быть безопасным для любых предоставленных данных.

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