Хватит ли этих функций безопасности? - PullRequest
3 голосов
/ 05 мая 2010

Я пытаюсь обезопасить свой сайт, чтобы не быть уязвимым для SQL-инъекций или xss

Вот мой код:

//here's the form (abbreviated)
<form>
<label for="first_name" class="styled">First Name:</label>
<input type="text" id="first_name" name="first_name" value="<?php if (!empty($first_name)) echo $first_name; ?>" /><br />

//submit button etc
</form>


if (isset($_POST['submit'])) {

 //gets rid of extra whitesapce and escapes
 $first_name = mysqli_real_escape_string($dbc, trim($_POST['first_name']));

 //check if $first_name is a string
 if(!is_string($first_name)
 { 
 echo "not string"; 
 }

 //then insert into the database. 
 .......

}

mysqli_real_escape_string: я знаю, что эта функция экранирует определенные буквы, такие как \ n \ r, поэтому, когда данные будут введены в базу данных, будет ли рядом со всеми экранированными буквами '\'?

  • Будет ли этого сценария достаточно для предотвращения большинства SQL-инъекций? просто экранирование и проверка, являются ли данные строкой. Для целочисленных значений (например, когда пользователи вводят цены), я просто: is_numeric().

  • Как мне использовать htmlspecialchars? Должен ли я использовать его только при отображении и отображении пользовательских данных? Или я должен также использовать это при вставке данных в базу данных?

  • Когда я должен использовать strip_tags или htmlspecialchars?

Итак, со всеми этими функциями:

if (isset($_POST['submit'])) {

 //gets rid of extra whitesapce and escapes
 $first_name = mysqli_real_escape_string($dbc, trim($_POST['first_name']));

 //check if $first_name is a string
 if(!is_string($first_name)
 { 
 echo "not string"; 
 }

 //gets rid of any <,>,&
 htmlspecialchars($first_name);

 //strips any tags with the first name
 strip_tags($first_name)

 //then insert into the database. 
 .......

}

Какие функции я должен использовать для внедрения SQL и какие я должен использовать для xss?

Когда пользователь может вставить против меня сценарии xss? Когда есть форма?

Ответы [ 4 ]

2 голосов
/ 05 мая 2010

Проверка, что данные являются строкой, бесполезна: строки - это именно то, что вы использовали бы для инъекций.

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

Вы захотите использовать htmlspecialchars для всего, к чему пользователь может прикоснуться, и вы захотите использовать его в тот момент, когда он отображается на странице. Если вы хотите, чтобы пользователи форматировали сообщения или что-то еще, вы должны предоставить им язык форматирования в виде BBCode (и конвертировать BBCode после , запустив htmlspecialchars). Если вам нужно хранить чистый HTML, вы не захотите использовать htmlspecialchars, но вы должны быть уверены, что писать могут только доверенные люди. Например, если вы пишете блог, вполне допустимо разрешить чистый HTML в самой записи блога, потому что только редакторы блога могут писать там. Тем не менее, вы не хотели бы разрешать это в комментариях, потому что каждый может писать что-то там, и это просто сделало бы слишком легким выполнение таких вещей, как межсайтовый скриптинг .

1 голос
/ 05 мая 2010

Если вы печатаете HTML, вы должны сначала очистить его HTML Purifier . Думайте об этом как о расширенной (и настраиваемой) версии strip_tags().

Для вставки в базу данных я использую подготовленные операторы . Это надежно.

1 голос
/ 05 мая 2010

Всякий раз, когда вы встраиваете предоставленную пользователем информацию в HTML, вы должны использовать htmlspecialchars. Всякий раз, когда вы встраиваете предоставленную пользователем информацию в SQL, вы должны использовать mysql_real_escape_string. Следуйте этим правилам, и вы должны быть в порядке.

Обратите внимание, однако, что лучшим решением для безопасности базы данных было бы использование подготовленных / параметризованных запросов (см. здесь и здесь ), поскольку они будут обрабатывать экранирование для вас исключая возможность вашего забывания.

Также не забудьте проверить магические кавычки .

1 голос
/ 05 мая 2010

Для SQL-инъекции mysql_real_escape_string должно работать. (Чтобы быть полностью уверенным, вы можете использовать подготовленные заявления)

Для XSS htmlspecialchars должно работать. strip_tags может быть не так безопасно, так как кто-то может хитро противостоять их JavaScript.

...