PHP безопасная пользовательская переменная - PullRequest
7 голосов
/ 21 августа 2010

На моем веб-сайте есть переменная с именем $user_data, содержащая входные данные из формы. Затем я показываю эту переменную на странице пользователя (через echo).

Каков наилучший способ избежать каких-либо угроз безопасности с этой переменной? Я использую strip_tags(), но этого недостаточно.

Эта переменная также сохраняется в базе данных MySQL.

Ответы [ 4 ]

14 голосов
/ 21 августа 2010

Есть две очень важные вещи, которые вы должны сделать, чтобы избежать серьезных проблем с безопасностью.

  1. Вам необходимо выйти из пользовательского ввода, прежде чем вводить его в свой запрос SQL.Экранирование означает экранирование всех специальных символов, таких как ';К счастью, есть функция, которая уже делает это автоматически: mysql_real_escape_string .

    Если вы не избежите пользовательского ввода, могут произойти неприятные вещи.Представьте, что ваш запрос INSERT INTO userdata VALUES ('$user_data').Теперь представьте, что пользователь написал '; DROP DATABASE userdata;.

    Если вы не избежите этого, ваш запрос станет: INSERT INTO userdata VALUES (''; DROP DATABASE userdata;').Как вы можете себе представить, это нехорошо: если у вас включено несколько операторов, вы можете попрощаться со своей базой данных.Это называется SQL Injection атака.

  2. Когда вы выводите свою переменную для пользователя, вам также необходимо правильно заменить специальные символы HTML на сущности HTML.К счастью, для этого тоже есть функция: htmlspecialchars () .Он преобразует специальные символы HTML, такие как <, в &lt;.

    . Эта проблема часто недооценивается, но на самом деле это очень серьезно.Представьте себе, если $user_data содержит <script>SomeNastyScript()</script>.Он может использовать существующие уязвимости в браузере ваших пользователей, или может отправлять не-HTTPOnly cookie (который может содержать сохраненные пароли) злоумышленнику, или он может заставить пользователя написать свой пароль в форме, сгенерированной с помощью манипуляцииDOM (возможно в javascript), или много других плохих вещей.

    Это называется XSS (межсайтовый скриптинг).


Короткая версия

  1. Вызовите mysql_real_escape_string в строке перед тем, как вставить ее в свой SQL-запрос (но не тогда, когда вы echo это).

  2. Вызовите htmlspecialchars в строке перед отображением ее пользователю (но не тогда, когда вы поместите ее в базу данных).

4 голосов
/ 21 августа 2010

Когда вы собираетесь что-то выводить, strip_tags или htmlspecialchars в порядке. Я предпочитаю последнее, так как тогда вы не полностью уничтожаете <3 и тому подобное, которые в любом случае никогда не подразумевались как HTML-теги.

При вводе значения непосредственно в запрос, mysql_real_escape_string - это подходящий способ избежать или просто использовать PDO и подготовленные операторы.

Конечно, лучше использовать эти escape-методы только тогда, когда они вам понадобятся, а не применять обе эти переменные когда-либо. Всегда трудно избавиться от косой черты из MySQL-экранированной переменной, если вы действительно хотите работать с ней, прежде чем поместить ее в базу данных, и это не лучше волшебных цитат PHP4. Точно так же вы не хотите превращать чей-либо пароль «один <два» в «один & lt; два» перед тем, как вставить его в базу данных. (Очевидно, вы не должны хранить незашифрованные пароли, но общий пример не работает.) </p>

2 голосов
/ 21 августа 2010

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

База данных 1 немного сложнее, чем просто «Вызов mysql_real_escape_string». Я подробно описал все правила в этом ответе

0 голосов
/ 16 октября 2015

Вы также можете сделать это:

$way = preg_replace('#[^a-z0-9]#i', '', 
    strip_tags(htmlentities(htmlspecialchars(mysqli_escape_string($db_conx, $_GET['way'])))));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...