2013-06-21 3 views
1

У меня есть таблица, в которой перечислены фильмы, и я включил простую функцию поиска. У меня есть одно текстовое поле в форме, где можно ввести заголовок или ключевое слово, а затем отправить форму.безопасность для простой формы поиска php

PHP код/​​MySQL, который делает работу является:

$find = $_POST['find']; 
$find = mysql_real_escape_string($find); 
$find = htmlspecialchars($find); 
$sql = "SELECT * FROM tbl_buyerguide WHERE rel_date BETWEEN NOW() AND DATE_ADD(now(), INTERVAL 2 MONTH) AND title LIKE '%".$find."%' ORDER BY title"; 

где «найти» это имя ввода текста в форме поиска.

Это работает достаточно хорошо для функциональности поиска по назначению.

Мой вопрос все:

ли mysql_real_escape_string и htmlspecialchars достаточно, чтобы сделать мой поиск форм обеспечения?

Я прочитал все вопросы, которые я могу найти в stackoverflow об этом, но мне бы очень хотелось, чтобы кто-то в курсе сказал мне «да, это все, что вам нужно» или «нет, вы также нужно учитывать ... ».

Спасибо заранее. Cheers Al.

ответ

1

Да, это достаточно, чтобы сделать его безопасным .... вы всегда можете бросить strip_tags() в там же ....

Хотя я бы просто сделать это в одной строке ... вместо того, чтобы использовать три

$find = htmlspecialchars(mysql_real_escape_string($_POST['find'])); 

Но чтобы сделать его безопасным и до настоящего времени, вы должны прекратить использовать mysql_ * функции, поскольку они являются устаревшими, и будут удалены в будущих relases РНР ....

вы вместо этого следует переключиться на mysqli_ * или PDO и реализовать подготовленные операторы, которые обрабатывают s для вас.

Пример ... в PDO

$db = new PDO('mysql:server=localhost;dbname=test', 'username', 'password'); 

    $find = $_POST['find']; 

    $query = $db->prepare('SELECT * FROM tbl_buyerguide WHERE rel_date BETWEEN NOW() AND DATE_ADD(now(), INTERVAL 2 MONTH) AND title LIKE :like ORDER BY title'); 
    $query->bindValue(':like', '%' . $find . '%'); 
    $query->execute(); 
+0

Благодаря KyleK, я должен сказать, я никогда не слышал ни, но я самоучка , поэтому мои знания неоднородны, и я был на ней только пару лет. Я буду изучать PDO. Еще раз спасибо – Almeister9

2

Помните поговорку: фильтр В, спасенное.

Вы не выводите термин там, так почему вы избегаете его для HTML-целей с помощью htmlspecialchars()?

Вместо этого ТОЛЬКО избегайте его для базы данных (вы должны использовать подготовленные инструкции, но это еще одна точка). Таким образом, вы должны не использовать htmlspecialchars.

Вместо этого, когда вы переходите к выходу переменной на HTML-страницу, вы должны избегать ее для HTML (опять же, используя htmlspecialchars).

Прямо сейчас, вы смешиваете базы данных и HTML побега, который собирается привести к ни быть эффективным ...

+1

+1. Из-за неуместного экранирования невозможно найти термины, у которых есть амперсанд (или другие специальные символы HTML). Экранирование не является проблемой, которую вы можете решить на этапе ввода. – bobince