2014-08-31 2 views
0

У меня есть страница, project.php. Я пытаюсь реализовать пули. Поэтому давайте скажем, что у меня есть запись в базе данных, которая называется A Project, а slug - a-project. Вот код PHPСлизы, разрушающиеся после первого слова

$slug = $_GET['name']; 
try { 
    $sql = "SELECT id FROM projects WHERE slug = '" . $slug . "' AND display = 1"; 
    $s = $pdo->prepare($sql); 
    $s->execute(); 
} catch(PDOException $e) { 
    die("Failed to run query: " . $e->getMessage()); 
} 

Это работает. Но когда я решил добавить в правила перезаписи в .htaccess так:

RewriteRule ^projects/([0-9a-zA-Z]+) project.php?name=$1 [NC,L] 

Это результат:

Failed to run query: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 

Повторяя из запроса возвращает SELECT id FROM projects WHERE slug = 'a' AND display = 1, который при запуске в PhpMyAdmin работает отлично, как и вы бы ожидали, что это нормально, без правила перезаписи.

Использование var_dump($_GET); возвращает array(1) { ["name"]=> string(1) "a" }

Это происходит только на несколько слизнях слова, если пробковый проект просто project работает

Почему мое правило переписывания разрывая слизняк после первого слова и развращает мой запрос , и как я могу это исправить?

+0

Пожалуйста, используйте подготовленные данные, как вы уже используете pdo. Вы подвергаетесь риску [** 'mysql injection' **] (http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php) – Fabio

ответ

0

([0-9a-zA-Z]+) соответствует всем символам, которые находятся между 0 и 9, a и z, и A и Z. Вы заметите, что символ - не находится между ними. Поскольку сегмент пути, который используется для slug, скорее всего, не будет использоваться ни для чего другого, вместо этого сопоставьте его с ([^/]+). Это будет соответствовать этому до следующего /.

RewriteRule ^projects/([^/]+) project.php?name=$1 [NC,L] 

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

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