Intereting Posts
Как json_encode массив с французскими акцентами? Можно ли планировать запуск PHP-скрипта в определенное время или по истечении определенного времени? API Карт Google v3: как установить уровень масштабирования и центр карты в отправленное пользователем местоположение? ошибка мыла. Неустранимая ошибка: исключение SoapFault: Не удалось подключиться к хосту PHP – вложенный список, разбитый на четные столбцы (исправление и обновления) У вас недостаточно прав для доступа к этой странице. Как получить идентификатор канала или URL-адрес после Google Oauth PHP Искать блок текста, возвращать ссылки в формате MP3 с помощью PHP PayPal Express Checkout Instant Update не обновляет доставку создать PHP с ant-скриптами Как искать строку во внутреннем массиве с помощью mongodb? Неопределенный индекс: ошибка в скрипте php Проблема с PHPMaker Mysql Создание многоуровневого массива с использованием parentIds в PHP PHP – разница в месяцах DateTime, не учитывающая разницу в году

Когда следует использовать подготовленные заявления?

Первоначально я использовал mysql_connect и mysql_query, чтобы делать что-то. Затем я узнал о SQL-инъекции, поэтому я пытаюсь научиться использовать подготовленные инструкции. Я понимаю, как функции подготовки и выполнения класса PDO полезны для предотвращения внедрения SQL.

Но, готовые заявления нужны только тогда, когда пользовательский ввод хранится в базе данных. Было бы все равно использовать mysql_num_rows, так как я действительно не рискую быть взломанным с помощью этой функции? Или более безопасно использовать подготовленные заявления для этого? Должен ли я использовать подготовленные инструкции для всего, что связано с использованием mysql? Зачем?

Я очень ценю любые ответы и отзывы. Спасибо.

ТЛ / др

Всегда. 100% времени, используйте его. Всегда; и даже если вам не нужно его использовать. ИСПОЛЬЗУЙТЕ ЕЩЕ ЕЩЕ.


mysql_* устарели. ( Обратите внимание на большой красный ящик? )

Предупреждение Это расширение было устарело в PHP 5.5.0, и оно было удалено в PHP 7.0.0. Вместо этого следует использовать расширение MySQLi или PDO_MySQL . См. Также MySQL: выбирая руководство по API и связанные с ним FAQ для получения дополнительной информации. Альтернативы этой функции включают:

  • mysqli_connect ()
  • PDO :: __ конструкт ()

Вам лучше использовать PDO или MySQLi . Любой из этих 2 будет достаточным в качестве совместимых библиотек при использовании подготовленных операторов.

Доверяя ввод пользователя без подготовленных заявлений / дезинфекции, это как оставить свой автомобиль в плохом районе, разблокирован и с ключами в замке зажигания. Вы в основном говорите, просто заходите и принимайте мои лакомства введите описание изображения здесь

Вы никогда не должны, и я имею в виду никогда, доверять пользовательскому вводу. Если вы этого не хотите:

SQL-инъекция

Что касается данных и их хранения, как указано в комментариях, вы никогда не сможете никогда и не должны доверять каким-либо связанным с пользователем вводам. Если вы на 101% уверены, что данные, используемые для управления указанными базами данных / значениями, жестко закодированы в вашем приложении, вы должны использовать подготовленные инструкции.

Теперь о том, почему вы должны использовать подготовленные заявления. Это просто. Чтобы предотвратить SQL Injection, но самым прямым способом. Способ работы с подготовленными операциями прост, он отправляет запрос и данные вместе, но отдельно ( если это имеет смысл, ха-ха ). Я имею в виду следующее:

 Prepared Statements Query: SELECT foo FROM bar WHERE foo = ? Data: [? = 'a value here'] 

По сравнению с его предшественником, где вы усекали запрос данными, отправляя его в целом – в свою очередь, это означает, что он был выполнен как одна транзакция, вызывающая уязвимости SQL Injection.

И вот пример псевдо- PHP PDO чтобы показать вам простоту подготовленных операторов / привязок.

 $dbh = PDO(....); // dsn in there mmm yeahh $stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)"); $stmt->bindParam(':name', $name); $stmt->bindParam(':value', $value); // insert one row $name = 'one'; $value = 1; $stmt->execute(); 

Взято из руководства PHP для подготовленных заявлений PDO


Подробнее Чтение

  • Как я могу предотвратить SQL-инъекцию в php?
  • Что такое SQL-инъекция? ( Простые условия )

TL; DR Используйте подготовленные заявления в 100% случаев, если ваше приложение принимает любой пользовательский ввод


У вас, похоже, небольшая путаница. Во-первых, не используйте mysql_* ; функции mysql_* устарели, устарели и небезопасны. Вместо этого используйте MySQLi или PDO . Во-вторых, mysql_num_rows имеет ничего общего с подготовленными операторами и вообще не является функцией PDO. Вы готовите заявление перед тем, как запускать запрос, а не после него, когда хотите подсчитать строки.

Что касается того, когда готовить заявления, @ Mike'Pomax'Kamermans пригвоздил его в комментариях. Если вы когда-либо, даже один раз, используете любые данные, которые когда-либо были затронуты пользователем – даже предположительно доверенным пользователем – или генерируются любым типом стороннего или стороннего приложения, включая браузер, с использованием подготовленных операторов. Только если 100% ваших данных жестко закодировано или сгенерировано полностью вашим кодом (например, простой переменной счетчика), вы можете доверять ему.

Например, вы не можете доверять:

  • Usernames
  • Пароли
  • Адрес электронной почты
  • Комментарии пользователей
  • Телефонные номера
  • Даты
  • Строки поиска
  • Строки клиента браузера
  • Номера кредитных карт
  • Имена файлов для загрузки
  • И любой другой вид ввода, созданный пользователем или который пользователь может манипулировать.

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

Mysql_* уже устарел, поэтому лучше переключить mysqli_* или PDO

Для предотвращения внедрения sql (mysql): – Как я могу предотвратить SQL-инъекцию в PHP? ,

И подготовленные операторы (это SQL-операторы, которые отправляются и анализируются сервером базы данных отдельно от любых параметров.) Используют в своих пользовательских данных запроса.

например, при отправке данных, которые соответствуют / получают записи в db с запросом. так что когда вы запускаете запрос с данными формы.

Для этого есть два решения:

01- Использовать подготовленные заявления

Чтобы предотвратить инъекции SQL, нам нужно будет использовать что-то, называемое подготовленными операторами, которое использует связанные параметры. Подготовленные утверждения не объединяют переменные со строками SQL, поэтому злоумышленник не может изменять инструкцию SQL. Подготовленные утверждения объединяют переменную с компилируемым оператором SQL, это означает, что SQL и переменные отправляются отдельно, а переменные просто интерпретируются как строки, а не часть оператора SQL.

02- Подготовленные сообщения с mySQLi.

Используя методы, описанные ниже, вам не нужно использовать какие-либо другие методы фильтрации SQL-инъекций, такие как mysql_real_escape_string (). Это связано с тем, что с помощью подготовленных операторов невозможно выполнить обычную SQL-инъекцию.

например –

 $name = $_GET['username']; if ($stmt = $mysqli->prepare("SELECT password FROM tbl_users WHERE name=?")) { // Bind a variable to the parameter as a string. $stmt->bind_param("s", $name); // Execute the statement. $stmt->execute(); // Get the variables from the query. $stmt->bind_result($pass); // Fetch the data. $stmt->fetch(); // Display the data. printf("Password for user %s is %s\n", $name, $pass); // Close the prepared statement. $stmt->close(); } 

Подробнее об этой форме вы можете узнать – http://www.wikihow.com/Prevent-SQL-Injection-in-PHP