使用友好网址更改.htacces时无法获取变量

时间:2018-05-17 17:13:37

标签: php mysql database variables

我是php的业余爱好者。我有一个网站,我从DB加载项目,例如,当我想加载一个proyect时,url就是这样的

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'] />

希望任何人都可以提供帮助。

先谢谢。

1 个答案:

答案 0 :(得分:1)

关于您的问题,这已在此处得到解答: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:在查询

之前对变量进行设置

而不是使用:

$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将准备声明并确保处理,评论或模糊所有可能有害的元素。

  

准备由PDOStatement :: execute()方法执行的SQL语句。 SQL语句可以包含零个或多个命名(:name)或问号(?)参数标记,在执行语句时将替换实际值。您不能在同一SQL语句中同时使用命名和问号参数标记;选择一个或另一个参数样式。使用这些参数绑定任何用户输入,不要在查询中直接包含用户输入。

希望有所帮助。