Что касается вашего вопроса, на этот вопрос уже был дан ответ: Перезапись URL с помощью PHP
В будущем, пожалуйста, не забудьте найти возможные решения.Обратите внимание на следующее в вашем файле .htaccess:
<ifModule mod_rewrite.c>
Options +FollowSymLinks
RewriteEngine on
RewriteRule ^/proyecto/id/([0-9]+)/$ /proyecto.php?id=$1
RewriteRule ^([^\.]+)$ $1.php [NC,L]
ErrorDocument 404 /error404.php
</ifModule>
Это первый шаг к созданию более безопасного GET-запроса.Например, это пройдет:
www.mywebsite.com/proyecto/id/1/
В то время как попытка злоумышленника потерпит неудачу:
www.mywebsite.com/proyecto/id/%5Cxbf%5Cx27%20OR%201%3D1%20%2F*
Это пройдет \xbf\x27 OR 1=1 /*
к вашему сценарию и может быть потенциально опасным.Поскольку это значение не от 0 до 9, условие перезаписи не должно выполняться.
В вашем запросе SQL.Это следующий уровень защиты, мы хотим убедиться, что мы используем только целочисленный тип переменной.Для этого мы хотим каким-то образом очистить входные данные из браузера.Более чем один способ сделать это.Мы можем сделать это перед передачей переменной в запрос или использовать функции PDO.
Пример 1. Сантифицировать переменную перед запросом
Вместо использования:
$valorid = $_GET['id'];
Если все, что введено как id
, будет помещено в переменную, мы можем сделать так, чтобы оно было числом.Что-то вроде:
$valorid = sprintf("%d", $_GET['id']);
Это менее используемый метод, поскольку он в основном форматирует переменную в цифру.
Пример 2. Использование подготовленного оператора PDO
См .: http://php.net/manual/en/pdo.prepared-statements.php
Примите во внимание следующее:
$conn = new PDO("mysql:host=$host;dbname=$db_name;charset=utf8",$username, $password);
$stmt = $conn->prepare('SELECT * FROM grafica WHERE id = ? LIMIT 1');
if ($stmt->execute(array($_GET['id']))) {
while ($row = $stmt->fetch()) {
// Do the needful
}
}
Это считается лучшим методом.Во-первых, мы улучшили оператор с LIMIT 1
, чтобы обеспечить только 1 результат.Во-вторых, PDO подготовит инструкцию и обеспечит обработку, комментирование или скрытие всех потенциально опасных элементов.
Подготавливает инструкцию SQL для выполнения методом PDOStatement :: execute ().Оператор SQL может содержать ноль или более маркеров параметров с именами (: name) или вопросительным знаком (?), Для которых действительные значения будут подставляться при выполнении инструкции.Вы не можете использовать маркеры параметров как именованных, так и вопросительных знаков в одной и той же инструкции SQL;выберите один или другой стиль параметра.Используйте эти параметры для привязки любого пользовательского ввода, не включайте пользовательский ввод непосредственно в запрос.
Надеюсь, это поможет.