Как очистить простой _GET ввод от URL до MySQL в PHP - PullRequest
0 голосов
/ 27 мая 2011

У меня есть простой php-скрипт, где, надеюсь, люди могут просто перейти к чему-то вроде http://mydomain.com/get.php?id=TEXTMASH-1FD0066D-F75A-5D0C-6784-2FA0D055B0D7 и извлечь этот текстовый блок из моей базы данных mysql. Я очень новичок в php. Зная, что все ожидаемые идентификаторы должны быть в формате TEXTMASH-1FD0066D-F75A-5D0C-6784-2FA0D055B0D7, как я могу "дезинфицировать" _GET, чтобы он не был уязвим для любых атак? Я посмотрел на некоторые руководства, но я просто не понимаю. Кто-нибудь ум показывает мне? Я действительно ценю это.

<?php 

include_once("../../extern/dbinclude.php");

$id= $_GET['id'];

$result = mysql_query("SELECT text FROM mytable WHERE id='$id'")
or die(mysql_error());  

$row = mysql_fetch_array($result);

if($row)
{
echo nl2br($row['text']);
} else {
?>
<h2>Invalid URL</h2>
<?php
}

Ответы [ 3 ]

2 голосов
/ 27 мая 2011

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

$pattern = '/^TEXTMASH-[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/';
if(!preg_match($pattern, $id))
{
    echo "No dice >:(";
    exit;
}
0 голосов
/ 27 мая 2011

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

Подготовленные операторы убирают эту боль из процесса и автоматически избегают вещей соответствующим образом.

Вы можете найти нашу дополнительную информацию в другом месте на SO .

0 голосов
/ 27 мая 2011

Два основных аспекта очистки входных данных:

  1. Подтвердите, когда получите. Проверьте PHP функции фильтра для выполнения проверки. В вашем случае идентификатор довольно сложный, и вам может потребоваться настраиваемая функция проверки (возможно, с использованием регулярных выражений) для этого. Однако я не понимаю, почему вы даже используете такой сложный идентификатор, когда вы можете использовать INTeger ID, как это обычно.
  2. Используйте mysql_real_escape_string () или подготовленные операторы перед вставкой пользовательской переменной в базу данных.

И всякий раз, когда вы отображаете строковую переменную, обязательно экранируйте любые символы HTML.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...