Отправляет email-рассылки с помощью сервиса Sendsay

Раскрутка и создание сайтов

  Все выпуски  

Раскрутка и создание сайтов Создание расширенного поиска на сайте


Всем кто долго искал, предлагаю такой вариант расширенного поиска на сайт, ВНИЗУ СТРАНИЦЫ

По усмотрению можете добавлять поля, но обязательно обрабатывайте полученные результаты mysql_real_escape_string, htmlspecialchars, trim  и если необходимо int


Немного про безопасность

 mysql_real_escape_string Функция экранирует специальные символы строки unescaped_string, принимая во внимание кодировку соединения, таким образом, что результат можно безопасно использовать в SQL-запросе в функци mysql_query().

ример 1. Пример использования mysql_real_escape_string()

<?php
$item 
"Zak's and Derick's Laptop";
$escaped_item mysql_real_escape_string($item);
printf ("Escaped string: %s\n"$escaped_item);
?>

Вышеописанный пример выдаст следующий результат:

Escaped string: Zak\'s and Derick\'s Laptop

 htmlspecialchars Преобразует специальные символы в HTML сущности

<?php
$new 
htmlspecialchars("<a href='test'>Test</a>"ENT_QUOTES);
echo 
$new// &lt;a href=&#039;test&#039;&gt;Test&lt;/a&gt;
?>

 trim  --  Удаляет пробелы из начала и конца строки

Описание

string trim ( string str [, string charlist] )

Эта функция возвращает строку str с удаленными из начала и конца строки пробелами. Если второй параметр не передан, trim() удаляет следующие символы:

 

  • " " (ASCII 32 (0x20)), символ пробела.

  • "\t" (ASCII 9 (0x09)), символ табуляции.

  • "\n" (ASCII 10 (0x0A)), символ перевода строки.

  • "\r" (ASCII 13 (0x0D)), символ возврата каретки.

  • "\0" (ASCII 0 (0x00)), NUL-байт.

  • "\x0B" (ASCII 11 (0x0B)), вертикальная табуляция.

 

Можно также задать список символов для удаления с помощью аргумента charlist. С помощью .. можно задать диапазон символов.


Пример 1. Пример использования trim()

<?php

$text 
"\t\tЛишь несколько слов :) ...  ";

echo 
trim($text);           // "Лишь несколько слов :) ..."
echo trim($text" \t."); // "Лишь несколько слов :)"

// удалить управляющие символы ASCII из начала и конца
// строки $binary (от 0 до 31 включительно)
$clean trim($binary"\x00..\x1F");

?>

Замечание: Необязательный аргумент charlist был добавлен в версии 4.1.0

 ПОДРОБНО ПРО БЕЗОПАСНОСТЬ МОЖНО ПОЧИТАТЬ ТУТ

http://www.phpsql.ru/site-defence 

 

 Пример обработки POST и GET

 <?

$search = $_POST['search'];
$search = addslashes($search);
$search = htmlspecialchars($search);
$search = stripslashes($search);
?>

 либо

 

если передает число то можно добавить int - приводит к целочисленному типу

$search = (int)($search); 

Все можно записать одной строкой 

<? if(isset($_POST['biz'])) {$free_vk = trim(mysql_real_escape_string(htmlspecialchars((int)$_POST['biz'])));if ($biz == ''){unset($biz);}}?>

 С GET ПОСТУПАЕМ ТАКЖЕ

<?  $id=(int)$_GET["id"]; ?>

 При запросе к базе данных


1. Защищаем числовые данные 

Пример взлома: 
"SELECT * FROM base WHERE id=" .$_GET["id"]; 
Для /?id=5 все работает отлично, но хакер вводит 
/?id=5;DROP TABLE base; 

получаются 2 запроса: 
"SELECT * FROM base WHERE id=1; DROP TABLE base" 
В результате все данные таблицы base удаляются. Оно нам надо? 

Защита: 
Целые числа ВСЕГДА прогоняем через функцию intval() или преобразуем в (int), например: 
"SELECT * FROM base WHERE id=" .intval($_GET["id"]); 
или 
$id=(int)$_GET["id"]; 
"SELECT * FROM base WHERE id=" .$id; 

2. Защищаем строковые данные. 

Пример взлома: 
$search = $_GET["search"]; 
"SELECT * FROM base WHERE text LIKE (`%$search_text%`) 
Для /?search=abc все отлично, но если наберут например 
/?search=`)+and+(id=`1 
получаем запрос 
"SELECT * FROM base WHERE text LIKE('%') AND (id='1%')" 
где еще выводятся и значения с id=1 и т.п. 
Возможности для творчества злоумышленника большие. Как их закрыть? 

Защита: 
Все строковые данные заключаем в фунцию mysql_real_escape_string(). 
Она экранирует специальные символы, например, заменяет ` на \`. 
Пример: 
"SELECT * FROM base WHERE text LIKE(`%" .mysql_real_escape_string($search). "%`"; 

ОБРАБОТАТЬ МОЖНО ЕЩЕ И ТАК

Обработка строки

Первым делом надо порезать ручками строку.

$search = substr($search, 0, 64);

64 символов пользователю будет достаточно для поиска. Теперь каленым железом выжжем все "ненормальные" символы.

$search = preg_replace("/[^\w\x7F-\xFF\s]/", " ", $search);

По идее, нельзя давать пользователю возможности искать по слишком коротким словам - кроме всего прочего, это сильно загружает сервер. Итак, разрешим искать только по словам, которые длиннее двух букв (если ограничение больше, надо заменить "{1,2}" на "{1, кол-во символов}").

$good = trim(preg_replace("/\s(\S{1,2})\s/", " ", ereg_replace(" +", "  "," $search ")));

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

$good = ereg_eplace(" +", " ", $good);

   

Итак САМ РАСШИРЕННЫЙ ПОИСК

 <form name="search" method="post" action="">

<input type="checkbox" name="biz" value="1">Авто<br>
<input type="checkbox" name="stroika" value="1">Строительство<br>
<input type="checkbox" name="shop" value="1">Одежда<br>
<input type="submit" name="submit" value="Поиск">
</form>
<?
$data = array(); //создаем массив
 
if(!empty($_POST['biz']))
$data[] = "`biz`='".mysql_real_escape_string((int)$_POST['biz'])."'";
if(!empty($_POST['stroika']))
$data[] = "`stroika`='".mysql_real_escape_string((int)$_POST['stroika'])."'"; 
if(!empty($_POST['shop']))
$data[] = "`shop`='".mysql_real_escape_string((int)$_POST['shop'])."'";

 
if(count($data) > 0)
{
 $query = mysql_query(
              "SELECT *
               FROM `название таблицы`
               WHERE ".implode(' or ', $data)
               );
			   
			   while($sql = mysql_fetch_array($query)) // выводим нужные нам поля из таблицы
{echo "
<div style='margin:20px;border:2px solid #f3f3f3;padding:10px;'>
<div>".$sql['company']."</div>
<div>".$sql['opisanie']."</div
></div>
";
			
			} 
} 

?>

В избранное