Если вы хотите предотвратить атаки 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>
он будет преобразован в <script>
.
Вы также можете настроить белый список, в котором вы можете разрешать только теги X для ввода пользователем. Это особенно полезно для сайтов, ориентированных на контент, где пользователям может потребоваться доступ к определенным тэгам html, таким как divs, p tags и т. Д., Но, например, не теги скриптов. Любые теги, не входящие в белый список, будут отфильтрованы. Это довольно сложно полностью покрыть, поскольку существует так много способов сделать что-то, но тем не менее оно может обеспечить дополнительную безопасность. См. http://php.net/manual/en/function.filter-var.php для получения дополнительной информации.
Третий подход заключается в замене html-тегов на пользовательские теги (например, SO). Таким образом, звезда infront слова может представлять собой тег html и т. Д.
Обратите внимание, что если вы заняли последние два, вы должны STILL избежать данных. Все входные данные пользователя должны рассматриваться как потенциально опасные, даже если они отфильтрованы, потому что, как говорится, всегда есть несколько способов кошки кошки.
Используйте подготовленные заявления и позаботится обо всех этих мешаниях – Achrome
Должен ли membernumber быть int? Почему бы просто не использовать 'intval ($ _ GET ['membernumber'])'? – Ladadadada
Да, это должно быть int – Zaz