Php .htaccess规则不起作用
PHP: htaccess:Php .htaccess规则不起作用,php,.htaccess,Php,.htaccess,PHP: htaccess: $category = $_GET["category"]; $result = "SELECT * FROM my".$category." ORDER BY id_".$category."; 如果我在url浏览器中插入: RewriteRule ^category_(.*)\/?$ site/category.php?category=$1 [NC,L] RewriteRule ^category_(.*)_(.*)\/?$ site/category.ph
$category = $_GET["category"];
$result = "SELECT * FROM my".$category." ORDER BY id_".$category.";
如果我在url浏览器中插入:
RewriteRule ^category_(.*)\/?$ site/category.php?category=$1 [NC,L]
RewriteRule ^category_(.*)_(.*)\/?$ site/category.php?category=$1&page=$2 [NC,L]
它起作用了
但如果我插入:
site.com/category_namecategory
返回:
site.com/category_namecategory_numberpage
2是数字页,但我想要的是类别而不是数字
我不知道哪里出了问题您的第一条规则与两个请求都匹配,您可以通过在第一个重写模式中添加一个否定字符类来修复此问题
Error: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'myDB.my_2' doesn't exist
您的第一条规则是
*
和可选的/
,这两个URL都匹配,不够严格
此更新的规则应允许您期望的URL。如果需要允许添加更多字符,则[]
是一个字符类。{}
是一个范围,第一个数字最小,第二个数字最大
RewriteRule ^category_([^_]+)/?$ site/category.php?category=$1 [NC,L]
RewriteRule ^category_(.*)_(.*)/?$ site/category.php?category=$1&page=$2 [NC,L]
测试regex的一个好地方是regex101。它显示了正则表达式匹配的内容,并解释了其中的每个部分
原始示例:新例子: 这将解决您的
.htaccess
问题
注意:在regex101上,分隔符是/
,因此所有/
都需要转义,这取决于使用regex的语言/软件,可能不需要分隔符。/
不是特殊字符,除非它是分隔符。所以它不需要逃逸
这:
但是仍然可以进行sql注入。用户可以在$\u GET[“category”]
中输入任何内容,并从数据库中获取内容。恶意用户甚至可能提取所有用户名、密码和电子邮件
看看:
有关SQL注入以及如何防止SQL注入的更多信息。Thank's@chris85我如何只接受4到20个字母?Thank@chris85,如果您想创建答案,我选择作为已解决感谢您@starkeen您的逻辑正常。这也行得通,但我遵循了chris85的建议,以避免sql注入,这样就不会做出任何错误的假设;SQL注入的危险在于:
$result=“从我的“$category.”中选择*。按id排序“$category”。";代码>。再次感谢@chris85我数据库中表的真实名称类似于Mytablename\u secondname\u thirdname
我只将表名的一部分放入变量中。这仍然是一个问题?您应该创建一个可以传入的术语白名单(数组),并检查提供的值是否至少在该数组中。否则,用户可以对您的数据库做任何他们想做的事情。我正在使用PDO示例来表示表$stmt->bindparam(“:title”,“$titless”)的值$stmt->bindparam(“:content”,$contentss)代码>这不再免除创建白名单数组?您不能绑定表/列。这里是白名单方法的大致概念。但是首先是.htaccess,我根据您的提示输入了字母[a-zA-Z]{4,20}
,任何输入字符的内容都指向notfound.html。所以我无法想象SQL注入攻击url怎么可能
RewriteRule ^category_([a-zA-Z]{4,20})/?$ site/category.php?category=$1 [NC,L]
RewriteRule ^category_(.*)_(.*)/?$ site/category.php?category=$1&page=$2 [NC,L]
$category = $_GET["category"];
$result = "SELECT * FROM my".$category." ORDER BY id_".$category.";