2012-03-11 2 views
1

Im используя следующий код

$query = "SELECT * FROM raids WHERE RaidNum = '".$_GET["RaidNum"]."'";

, который улавливает из /raiddisplay.php?RaidNum=r75

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

+1

Это информация, полная противоположность безопасности. Прочтите [здесь] (http://stackoverflow.com/questions/60174/best-way-to-stop-sql-injection-in-php) для более безопасных способов достижения этого. – Perception

+0

Нет, это не безопасно. Прочитайте дезинфицирующие данные. Вот фрагмент из W3 на [дезинфицирующие входы] (http://www.w3schools.com/php/php_filter.asp). – nategood

+0

Возможный дубликат [Лучший способ остановить SQL Injection в PHP] (http://stackoverflow.com/questions/60174/best-way-to-stop-sql-injection-in-php) – dynamic

ответ

4

Это совершенно небезопасно. Предположим, что я посетил /raiddisplay.php?RaidNum=';drop%20table%20raids;--, тогда я бы просто отказался от таблицы, вместо того, чтобы читать запись.

Лучшим решением является использование prepared statements. Некоторые могут предложить использовать mysql_real_escape_string, но даже это старое и громоздкое. Хотя это само по себе безопасно, вы должны помнить, что всегда применяйте его. Используя подготовленные инструкции с параметрами или используйте библиотеку, которая создает для вас инструкции, вы всегда в безопасности.

Я думаю, что самый простой способ использовать эту функцию - использовать PDO, или PHP Data Objects.

+0

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

+1

Да, это оператор, содержащий параметры, в которых вы передаете значения для запроса. Заявление подготовлено, затем вводятся значения. В этих типах запросов значения не анализируются парсером запросов вообще, поэтому вам не требуется экранирование. Пожалуйста, взгляните на ссылку PDO, которую я добавил. – GolezTrol

+2

Гоша есть много, чтобы просмотреть их, но спасибо, что указали мне в направлении, которое я сразу рассмотрю. –

-2

Твои инстинкты были верны. Это небезопасно. Каждый раз, когда вы передаете конфиденциальную информацию (например, данные формы или данные, которые любой может просматривать/изменять) через MySQL, вы хотите ее избежать. Сделайте это:

$raidNum = mysql_real_escape_string($_GET["RaidNum"]); 
$query = sprintf("SELECT * FROM raids WHERE RaidNum = '$raidNum'"); 

http://php.net/manual/en/function.mysql-real-escape-string.php

+0

Это хороший ответ. Интересно, почему это было проголосовано. Ну хорошо;) – Norse

+0

из руководства phh/mysql я читал следующее: «mysql_real_escape_string() вызывает библиотечную функцию MySQL mysql_real_escape_string, которая добавляет обратную косую черту к следующим символам: \ x00, \ n, \ r, \, ', и \ x1a. " Помимо этих опасных символов, один из которых я действительно знал из вышеприведенного. Этот метод достаточно защищает его. Что я пытаюсь получить, есть что-то еще, что может быть передано, которое не включает эти специальные символы. –

+0

@RyanWalkowski У меня никогда не возникало проблем с использованием mysql_real_escape_string в сочетании с 'sprintf'. Что касается вашего вопроса, я точно не знаю. – Norse

1

Лучше всего, чтобы обернуть $ _GET с функцией mysql_real_escape_string. Когда вы будете более продвинутыми, перейдите к PDO.

$query = "SELECT * FROM raids WHERE RaidNum = '".mysql_real_escape_string($_GET["RaidNum"])."'"; 
+1

Итак, PDO продвинулся? Это не сложнее. Не утруждайтесь старыми функциями 'mysql_'. Забудьте их, чем скорее, тем лучше. – kapa

+0

Я нахожу, что они обычно связаны с ООП, который является полупродвинутым PHP, не в том месте, где хранитель сейчас держится! – yehuda

+0

Да, я нигде рядом с передовыми, мне приходится искать почти все кусочки кода, которые я делаю, чтобы найти примеры и объяснения. –

1

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

Сначала вы можете сделать простую проверку, что RaidNum - это int (я предполагаю, что это имеет место здесь);

$raidNum = (int)$_GET['RaidNum']; //This is pretty good sanitisation in itself if 
            //you are expecting integers 

Вы можете увидеть, как instantiate a PDO object в документации.

Тогда вы первый prepare ваш запрос: -

$stmnt = $dbh->prepare('SELECT * FROM raids WHERE RaidNum = :RaidNum'); 

Тогда вы можете execute заявление: -

$stmnt->execute(array(':RaidNum' => $raidNum)); 

Последний шаг заключается в fetchAll или fetch результатом

$result = $stmnt->fetchAll(); 

Это, вероятно, немного сложнее, чем вы ожидали, но это хорошо потраченные усилия. Вы всегда можете скрыть это в слое абстракции или функции.

+0

Благодарим вас за четкое точное объяснение и примеры. Я не совсем понимаю, что происходит полностью, но я буду искать каждую часть, чтобы лучше изучить ее. –

+0

Добро пожаловать. Мы обычно благодарим друг друга с upvotes на SO :) – vascowhite

+0

Я попытался подняться, но мне нужно 15 репа для этого, и им совершенно новый для stackoverflow –

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