2013-05-25 3 views
0

я хочу, чтобы проверить мои данные от пользователя для XSS и SQL инъекции, и это, как я пыталсяКак предотвратить против XSS и SQL инъекции

if (isset($_GET['membernumber'])) 
{ 
    $mem = htmlentities($_GET['membernumber']); 
    $memberparamter = cleanData($mem); 

} 

Но какой метод является лучшим/правильный способ проверить?

Метод 1

function cleanData($data) 
    { 
     $data=mysql_real_escape_string($data); 
     $data=trim($data); 
     $data=stripcslashes($data); 
     $data=htmlspecialchars($data); 
     $data=strip_tags($data); 
     return $data; 
    } 

Метод 2

function cleanData($data) 
    { 
     $data=mysql_real_escape_string($data); 
     $data=trim($data); 
     $data=strip_tags($data); 
     return $data; 
    } 

method3

htmlspecialchars(stripcslashes(trim($data))) 
+1

Используйте подготовленные заявления и позаботится обо всех этих мешаниях – Achrome

+0

Должен ли membernumber быть int? Почему бы просто не использовать 'intval ($ _ GET ['membernumber'])'? – Ladadadada

+0

Да, это должно быть int – Zaz

ответ

3

Как уже упоминалось, подготовленные операторы являются одним из лучших способов предотвращения инъекций SQL. то есть вы не должны добавлять свои параметры как часть окончательной строки запроса. Вы должны использовать заполнитель параметров и добавить параметры через массив ключей/значений.

Если вы используете PDO, посмотрите на эту страницу, которая описывает подготовленные заявления более подробно:

http://php.net/manual/en/pdo.prepared-statements.php

Довольно подробное объяснение входных фильтров PHP (и хорошая статья на обеззараживание) можно найти здесь:

http://coding.smashingmagazine.com/2011/01/11/keeping-web-users-safe-by-sanitizing-input-data/

Проверить здесь для собственных фильтров/функций санитарной обработки в PHP:

http://www.php.net/manual/en/filter.filters.php

Вы, вероятно, заинтересованы в filter_var и filter_input функции:

Кроме того, этот вопрос имеет некоторые хорошие указатели: What's the best method for sanitizing user input with PHP?

Этот вопрос имеет очень хорошие указатели: What are the best PHP input sanitizing functions?

-2

XSS $ данных = htmlspecialchars ($ данных); sql injection $ data = stripcslashes ($ data);

Если данные будут сохранены в db, а затем отобразятся на веб-странице, вы должны оба они.

+0

Нет, не 'stripcslashes', а использовать подготовленные заявления. –

+0

yeah.thanks Marcel – HuangJacky

1

Если вы хотите предотвратить атаки SQL-инъекций, используйте подготовленные операторы. Когда вы делаете что-то вроде

SELECT * FROM TABLE WHERE id = $_GET['x'] 

Проблема с этим запросом - это переменная, которая считается частью оператора SQL. Это означает, что СУБД будет анализировать/компилировать и выполнять переменную вместе с остальной частью запроса.Так эффективно, я мог бы предоставить что-то вроде

$x = "1); DROP TABLE users;" 

и так как его часть инструкции сервер выполнит эту команду.

Когда вы вводите подготовленные операторы, область видимости переменной будет ограничена областью действия параметра и не будет влиять на оставшуюся часть запроса, даже если она не экранирована. Это связано с тем, что SQL-оператор анализируется/выбирается/скомпилируется и т. Д. В базе данных, и все, что вам нужно сделать, это привязать параметры. Оператор sql представляет собой шаблон .

SELECT * FROM TABLE WHERE id = ? 

Дополнительное преимущество использования подготовленных заявлений - скорость. Поскольку шаблон уже разобран/скомпилирован и т. Д., База данных не потребуется повторять этот процесс, и поэтому его можно использовать повторно, все, что вам нужно сделать, это заменить параметры.

В PHP функции PDO и mysqli_ * поддерживают подготовленные операторы.

Для MySQLi см http://php.net/manual/en/mysqli.prepare.php Для PDO см http://php.net/manual/en/pdo.prepare.php

Как для XSS атак, вы можете взять несколько подходов с этим. Во-первых, просто избегать ЛЮБОГО пользовательского ввода, когда печатается на странице. Такие опасные символы, как:

<>"" // and so on 

Будет заменен их эквивалентом сущности html. Поэтому в случае <script> он будет преобразован в &lt;script&gt;.

Вы также можете настроить белый список, в котором вы можете разрешать только теги X для ввода пользователем. Это особенно полезно для сайтов, ориентированных на контент, где пользователям может потребоваться доступ к определенным тэгам html, таким как divs, p tags и т. Д., Но, например, не теги скриптов. Любые теги, не входящие в белый список, будут отфильтрованы. Это довольно сложно полностью покрыть, поскольку существует так много способов сделать что-то, но тем не менее оно может обеспечить дополнительную безопасность. См. http://php.net/manual/en/function.filter-var.php для получения дополнительной информации.

Третий подход заключается в замене html-тегов на пользовательские теги (например, SO). Таким образом, звезда infront слова может представлять собой тег html и т. Д.

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

+0

Thanx :) Итак, как вы это сделаете, если вам нужно предотвратить xss и sql inj. с пользовательскими вводами, такими как числовые типы. Можете ли вы привести мой пример? – Zaz

0

Ни один из них не является достаточно эффективным.

Вы должны искать санитацию, как и вы, и использовать подготовленные заявления.

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