2012-05-27 3 views
0

Я работаю над несколькими страницами, чтобы управлять данными, поступающими из текстового поля, которое пользователь может использовать для написания контента через базовый редактор WYSIWYG. В этом текстовом поле я сокращаю несколько тегов. Мне интересно, достаточно ли следующего процесса, чтобы защитить себя от спама и других скрытых опасностей, связанных с внедрением запросов sql и т. Д.Strip Tags, удалить другие символы и mysql_real_escape_string достаточно?

Мои шаги

function string_db ($value) 
{ 
    $value = (get_magic_quotes_gpc()) ? stripslashes($value) : $value; 
    return mysql_real_escape_string($value); 
} 

$content = string_db(trim($_POST['conten'])); 
$content = strip_tags($content, '<p><a><b><u><i>'); // The 5 tags allowed 
$content = str_replace("&lt;", "", $content); 
$content = str_replace("&gt;", "", $content); //In case someone try to type html entities instead of html code 

//INSERT DATA IN DB 

На странице, где я отображать данные, ранее сохраненные в БД я использую:

echo html_entity_decode($contentFromDb); 

Является ли это достаточно? Есть ли список тестов для того, чтобы доказать эффективность?

Большое спасибо

+0

Возможно, вы не должны использовать стрипы. По-видимому, он имеет уязвимости. Вместо этого вы должны использовать что-то вроде HtmlPurifier. http://htmlpurifier.org/comparison – Gohn67

+0

Я проверяю уязвимости ленточных тегов, и я планирую удалить все атрибуты on (Event) в теге A. HtmlPurifier - отличное решение, но оно слишком тяжелое – user1225730

ответ

2

Вы должны использовать PDO функциональность PHP вместо. Используя это, вы создаете подготовленные инструкции, которые помогут устранить уязвимости SQL-инъекций.

$DBH = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass); 
$STH = $DBH->("INSERT INTO table (col1, col2, col3) values (?, ?, ?);"); 

# assign variables to each place holder, indexed 1-3 
$STH->bindParam(1, $col1var); 
$STH->bindParam(2, $col2var); 
$STH->bindParam(3, $col3var); 

# insert one row 
$col1var = "My first value" 
$col2var = "Value 2"; 
$col3var = "Someone's 3rd value"; 
$STH->execute(); 

# insert another row with different values 
$col1var = "My first value; Query 2" 
$col2var = "Value 2 -- of the second query"; 
$col3var = "Someone's 3rd value;#This one has weird characters"; 
$STH->execute(); 

В приведенном выше примере, мы подключаем к базе данных и установите ручку базы данных, как $DBH. Затем мы готовим наш запрос и используем неназванные заполнители (?). Затем мы привязываем наши переменные PHP к неназванным заполнителям. Наконец, мы устанавливаем наши переменные и выполняем запрос. Это можно повторить с новыми значениями, просто изменив данные в переменных PHP.

+0

Хороший вопрос об использовании pdo и подготовленные заявления. Это поможет с внедрением SQL, но все равно может быть уязвимым для атак XSS, поскольку он разрешает некоторые html через WYSIWYG и, я думаю, отображает этот ввод. – Gohn67

+0

Я бы также рекомендовал использовать входные значения через одну или несколько функций фильтра (http://php.net/manual/en/ref.filter.php), но я от всей души повторил использование PDO над использованием более старые библиотеки MySQL. –

+0

Интересное решение PDO. Только один вопрос, решение, которое я опубликовал, достаточно безопасно для SQL-инъекций? Потому что я пробовал какую-то «атаку», и кажется, что это безопасно, но я не хакер, поэтому я не знаю, действительно ли это безопасно. – user1225730