【发布时间】:2017-05-22 07:40:46
【问题描述】:
我的网站有一个网址(example.com/folder/index.php?id=22)
上面的 URL 显示帖子 id 22。这是另一个重要部分:
|-------|-----------|-------------------|-------------------|
| id | user | title | url |
|-------|-----------|-------------------|-------------------|
| 22 | Admin | My Title Posts | my_title_post |
| | | | |
|-------|-----------|-------------------|-------------------|
include_once 'dbconnect.php';
$query = $con->query("SELECT * FROM posts WHERE id=".$_GET['id']);
$Row=$query->fetch_array();
echo $Row['user'];
echo $Row['title'];
echo $Row['url'];
结果:
-管理员
-我的标题帖子
-my_title_post
我试图通过添加.htaccess来隐藏$_GET['id'];
RewriteEngine on
RewriteRule ^newfolder/(.*) folder/index.php?id=$1
我的新网址是:example.com/newfolder/22
但是,这仍然不太正确。我试图在 URL 部分显示一个长的帖子 URL,而不是 ID。 所以我的意思是,如何使 URL 变为:
example.com/newfolder/my_title_post
我已将 SQL 更改为:
"SELECT * FROM posts WHERE url=".$_GET['id']但是服务器无法处理请求。
我也尝试更改数据库 url 列中的主键,但请求被拒绝。在这里我将它设置为唯一,但它仍然不起作用。
有可能做到吗? 如果有人知道,我会通过 Cpanel、htaccess、SQL 或其他方式接受建议。谢谢..
【问题讨论】:
-
你知道如果有人去这个网址会发生什么:example.com/folder/index.php?id=1%20OR%201%3D1。了解 SQL 注入 - w3schools.com/sql/sql_injection.asp
-
@lloiacono 我不明白你的意思
-
“我已将 SQL 更改为:“SELECT * FROM posts WHERE url=".$_GET['id'] 但服务器无法处理该请求。” – 这听起来更像是您还不能正确处理数据库错误 – 因此您首先应该阅读。 询问数据库,你的语句有什么问题,所以你可以修复它。
-
@lloiacono 哦,是的。我不小心把代码剪得很窄。原代码使用real_escape_string
-
我试图告诉你你的代码容易受到 SQL 注入的影响,你不应该直接在查询中使用用户输入。在我上面的示例中,您的查询将如下所示: SELECT * FROM posts WHERE id=1 OR 1=1;这将显示所有记录,或者更糟糕的是,攻击者可能会删除您的数据库