php - 使用友好的 url 更改 .htaccess 时无法获取变量

标签 php mysql database variables

我是 php 的业余爱好者。我有一个网站,我可以在其中从数据库加载项目,例如,当我想加载项目时,网址如下所示

www.mywesite.com/proyecto.php?id=1

我做了一个 .htaccess 来使用这个网址:

www.mywebsite.com/proyecto/id/1

.htaccess

<ifModule mod_rewrite.c>
  Options +FollowSymLinks
  RewriteEngine on
  RewriteRule proyecto/id/(.*)/ proyecto.php?id=$1 
  RewriteRule proyecto/id/(.*) proyecto.php?id=$1 
  RewriteRule ^([^\.]+)$ $1.php [NC,L]
  ErrorDocument 404 /error404.php
</ifModule>

现在的问题是变量未定义,因为我认为是由于网址的更改。这就是我获取变量的方式

$valorid = $_GET['id'];
$connection = new 
PDO('mysql:host='.$host.';dbname='.$db_name.';charset=utf8',''.$username.'', ''.$password.'');
foreach($connection->query('SELECT * FROM grafica WHERE id = '.$valorid.'') 
as $row) {

}

我这样设置

<?php echo $row['nombre'] />

最佳答案

关于您的问题,这里已经得到解答:URL rewriting with 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:在查询之前对变量进行 Santize

而不是使用:

$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 将准备声明并确保所有潜在有害元素都得到处理、评论或掩盖。

Prepares an SQL statement to be executed by the PDOStatement::execute() method. The SQL statement can contain zero or more named (:name) or question mark (?) parameter markers for which real values will be substituted when the statement is executed. You cannot use both named and question mark parameter markers within the same SQL statement; pick one or the other parameter style. Use these parameters to bind any user-input, do not include the user-input directly in the query.

希望有帮助。

关于php - 使用友好的 url 更改 .htaccess 时无法获取变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50397084/

相关文章:

php - 在 PHP MySQL 上显示、连接、计数、分组 6 个表

php - Yii 数据库分析

PHP 启动 : Unable to load dynamic library 'fileinfo' undefined symbol

mysql存储过程列错误

mysql - 如何提高 Laravel View 中多个计数查询的性能

java - hibernate ,父/子混淆

带有 phantomjs 的 PHP 屏幕截图

java - 拥有多个 DAO 可以吗?

sql - 我可以使用 Oracle 转义列标题中的双引号吗?

database - 存储过程逆向工程