使用正则表达式根据PHP中的未编码字符验证编码URI

使用正则表达式根据PHP中的未编码字符验证编码URI,php,regex,validation,Php,Regex,Validation,我使用。根据,它对除以下字符以外的所有字符进行编码:A-za-z0-9-551;!~*'() 我通过编码这个字符串来测试它: https://example.com/-._~:/?#[]@!$&'()*+,;=$%^%22{}|<> 我试图使用测试/^[a-zA-Z0-9%.-~!'()*]+$/g,但它会传递一个字符串,例如abc。给你。我做错了什么 请注意,我并不是要验证URL的格式,只是想看看用户是否试图在javascript验证器周围插入任何有趣的东西,或者看看ja

我使用。根据,它对除以下字符以外的所有字符进行编码:
A-za-z0-9-551;!~*'()

我通过编码这个字符串来测试它:

https://example.com/-._~:/?#[]@!$&'()*+,;=$%^%22{}|<>
我试图使用测试
/^[a-zA-Z0-9%.-~!'()*]+$/g
,但它会传递一个字符串,例如
abc。给你。我做错了什么

请注意,我并不是要验证URL的格式,只是想看看用户是否试图在javascript验证器周围插入任何有趣的东西,或者看看javascript验证器是否损坏。以下是我试图为系统辩护的要点:


您的问题在于您的正则表达式中有
-
,它被解释为
(char 46)和
(char 95)之间的任何字符。您可以在regex101链接的解释中看到这一点。这包括
字符,这就是模式匹配的原因。要修复它,请在
-
前面添加一个
\
,以确保它被视为文本
-
,即将正则表达式更改为

^[a-zA-Z0-9%.\-_~!'()*]+$

encodeURIComponent()
对所有非字母数字字符进行编码。另一个
encodeURI()
不编码特殊字符,但将空格转换为
%20

encodeURI()
设计用于处理完整URI,而
encodeURIComponent()
设计用于处理URI的一段


我总是使用
encodeURIComponent()
来设置值,以确保AJAX请求中的数据安全。

我不确定URL编码是否与SQL验证有关。如果要防止SQL注入攻击,必须在服务器端PHP脚本中使用准备好的语句,或者对PHP中的输入进行消毒。@TimBiegeleisen我正在使用用于PDO的Laravel框架。他们说它是安全的,但我还是不愿意让用户发布任何使用它的东西。我想要一些限制条件来缩小问题的范围,这样我就可以试着去想任何驱动程序都可以被SQL注入,PDO本身并不能阻止SQL注入。您需要参数化查询。(与此无关,但regex不会在PHP中运行,没有
g
修饰符)@user3783243我正在使用,我只是希望它能像它所说的那样工作,因为我真的觉得我的技能不足以手动设置所有这些页面上有多个示例,注意,
原始语句将作为字符串注入查询中,因此,您应该非常小心,不要创建SQL注入漏洞。
显示某些使用是不安全的。我要说的是,使用正则表达式来验证SQL在大多数情况下都会被注入。这就做到了,谢谢!看起来我在查询方面还需要更多的工作,但这是我下一步要做的guess@Nick,
应该是
\。
否则它也可以解释为我假定的任何字符。@vivek\u 23不在
[]
^[a-zA-Z0-9%.\-_~!'()*]+$