2013-04-21 3 views
-2

Я сделал простой поисковый скрипт в PHP, который ищет базу данных mySQL и выводит результат. Как это работает:Правильно ли я санируюсь/бегаю?

  • Пользователь ищет «домкрат» через форму поиска.
  • Мой PHP-скрипт GET Этот поиск и дезинфицирует его.
  • Затем сценарий, используя SELECT и LIKE, получает результаты.
  • После этого сценарий выводит результат пользователю.
  • И, наконец, скрипт сообщает пользователю, что «результат возвращен x». с помощью ускользания.

Что я хотел бы задать, правильно ли я это делаю?

Это, как я дезинфицировать перед тем SELECTING из базы данных: «возвращаемые х результаты Джека»

if(isset($_GET['q'])){ 
    if(strlen(trim($_GET['q'])) >= 2){ 
    $q = trim(mysql_real_escape_string(addcslashes($_GET['q'], '%_'))); 
    $sql = "SELECT name, age, address FROM book WHERE name LIKE '%".$q."%'"; 
    } 
} 

И это, как я бежать перед выводом:

echo htmlspecialchars(stripslashes($q)) . " returned x results."; 

Является ли это правильный путь сделать это?

Кстати, я знаю, что PDO и mySQLi предпочтительнее, поскольку они санируют себя с помощью подготовленных заявлений, но у меня нет никакого реального опыта с ними. Но я бы с радостью посмотрел, если вы, ребята, могли бы связать мне несколько учебников/объяснений новичков. Кроме того, я слышал, что magic_quotes и charset могут так или иначе привести к инъекциям - это правильно?

+0

Вашего маскирования применяется точно в неправильном порядке. Может быть, объясните, как вы думали, что это сработает. – mario

+0

@mario Это? Я не знаю, какой порядок работает лучше/правильнее. Позвольте мне все равно объяснить. Когда скрипт 'GET', вход обрезается, и он проверяет, равен ли вход или длиннее 2 символа.Впоследствии он санирует, сначала добавляя косые черты к '%' и '_', чтобы предотвратить поиск по шаблону, затем он санирует вход с помощью' mysql_real_escape_string', и, наконец, он обрезает, если в начале или в конце есть пробел ввода. Независимо от того, что он дезинфицирует, в настоящее время проводится поиск в базе данных. Что касается ускользания - это работает, но я получил это из случайной темы. – AnonymousJ

+0

Ну, сначала выполняется обрезка, затем m_r_e_s, затем addcslashes для LIKE glob. – mario

ответ

0

По какой-то причине нам также нужны также escape a backslash.
Таким образом, правильный код будет, я считаю

if(isset($_GET['q'])){ 
    $_GET['q'] = trim($_GET['q']); 
    if(strlen($_GET['q']) >= 2){ 
    $q = $_GET['q']; 
    $q = '%'.addCslashes($q, '\%_').'%'; 
    // now we have the value ready either for escaping or binding 
    $q = mysql_real_escape_string($q); 
    $sql = "SELECT name, age, address FROM book WHERE name LIKE '$q'"; 
    //or 
    $sql = "SELECT name, age, address FROM book WHERE name LIKE ?"; 
    $stm = $pdo->prepare($sql); 
    $stm->execute(array($q)); 
    $data = $stm->fetchAll(); 
    } 
} 

Для выхода используйте

echo htmlspecialchars($_GET['q']); 

stripslashes не нужны здесь.

Кроме того, я слышал, что magic_quotes и charset могут так или иначе привести к инъекциям - это правильно?

магические кавычки не повредят вашей безопасности, если вы их не используете.
charset опасен в случае некоторых чрезвычайно редких кодировок, но только если неправильно установлен. если для этой цели были использованы mysql(i)_set_charset или DSN (в случае PDO) - вы снова в безопасности.

Что касается PDO, tag wiki должна быть достаточно для стартера, я считаю

+0

Спасибо за ваш ответ, но код, который вы указали, еще хуже. Прежде всего,%, используемые вокруг addCslashes, бесполезны, поскольку они могут быть размещены вокруг $ q, а SELECTING (что я и делаю). Наконец, для вывода требуется stripslashes, иначе он вернет «возвращенные результаты x jack» вместо «возвращенных результатов x jack». В общем, приведенный выше код почти идентичен моему, хотя ваш добавляет косые черты на которые я собираюсь украсть! – AnonymousJ

+0

Прошу прощения, но и ваши идеи ошибочны. При добавлении% s к переменной вы можете использовать ее либо для экранирования, либо для привязки. Я не буду ** называть это «хуже». И stripslashes ** никогда не нужны для чтения данных из базы данных. Если вам это нужно, это означает, что ваши данные испорчены либо магическими кавычками, либо каким-либо другим неправильным кодом. И вы должны очистить его вместо использования stripslashes. –

+0

Я думаю, вы что-то неправильно поняли (и, может быть, я не был ясно в своем посте). Мой вывод не поступает из базы данных (как вы указываете), но из того, что пользователь ввел в качестве ввода. Так что да, имеет значение, когда я добавляю% s, и важно использовать stripslashes, так как я ** не ** читаю данные из базы данных в случае вывода. – AnonymousJ

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

  • Нет связанных вопросов^_^