我是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'] />
希望任何人都可以提供帮助。
先谢谢。
答案 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语句中同时使用命名和问号参数标记;选择一个或另一个参数样式。使用这些参数绑定任何用户输入,不要在查询中直接包含用户输入。
希望有所帮助。