PHP:
$category = $_GET["category"];
$result = "SELECT * FROM my".$category." ORDER BY id_".$category.";
htaccess的:
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
返回:
Error: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'myDB.my_2' doesn't exist
2是数字页面,但我希望类别不是数字。
我不知道我哪里出错了
答案 0 :(得分:2)
您的第一条规则匹配这两个请求,您可以通过在第一个重写模式中添加否定字符类来解决此问题。
RewriteRule ^category_([^_]+)/?$ site/category.php?category=$1 [NC,L]
RewriteRule ^category_(.*)_(.*)/?$ site/category.php?category=$1&page=$2 [NC,L]
答案 1 :(得分:2)
您使用.*
和可选/
的第一条规则不够严格,并且两个网址都匹配。
此更新的规则应允许您期望的网址。 []
是一个字符类,如果有更多字符需要允许在那里添加它们。 {}
是范围,第一个数字是最小值,第二个是最大值。
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]
测试正则表达式的好地方是regex101。它显示了正则表达式匹配的内容并解释了它的每个部分。
原始示例:https://regex101.com/r/zO7lI8/1
新示例:https://regex101.com/r/zO7lI8/2
这应解决您的.htaccess
问题。
请注意,对于regex101,分隔符为/
,因此需要对所有/
进行转义,具体取决于使用正则表达式的语言/软件,可能不需要分隔符。除非是分隔符,否则/
不是特殊字符。所以它不需要被转义。
此:
$category = $_GET["category"];
$result = "SELECT * FROM my".$category." ORDER BY id_".$category.";
虽然仍然对sql注入开放。用户可以在$_GET["category"]
中输入任何内容并从数据库中获取内容。恶意用户甚至可能会提取所有用户名,密码和电子邮件。
看看:
How can I prevent SQL injection in PHP?
http://php.net/manual/en/security.database.sql-injection.php
https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet
有关SQL注入以及如何防止它们的更多信息。