更改.htacces的友好url时无法获取变量

azpvetkf  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(395)

我是php的业余爱好者。我有一个网站,我从数据库加载项目,例如,当我想加载一个项目的网址是这样的
www.mywesite.com/proyecto.php?id=1
我做了一个.htaccess来使用这个url:
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>

现在的问题是,由于url的变化,变量没有定义。我就是这样得到变量的

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

希望有人能帮忙。
提前谢谢。

wa7juj8i

wa7juj8i1#

关于你的问题,这里已经回答了:用php重写url
今后,请务必寻找可能的解决方案。请考虑.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 prepared语句
请参阅: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 确保我们只得到一个结果。第二,pdo将准备声明,并确保所有潜在的有害元素都得到处理、评论或掩盖。
准备要由pdostatement::execute()方法执行的sql语句。sql语句可以包含零个或多个命名(:name)或问号(?)参数标记,在执行语句时,实值将被替换。不能在同一sql语句中同时使用命名参数标记和问号参数标记;选择一个或另一个参数样式。使用这些参数绑定任何用户输入,不要将用户输入直接包含在查询中。
希望有帮助。

相关问题