gpt4 book ai didi

php - preg_match 在输入缎化中是否安全?

转载 作者:可可西里 更新时间:2023-11-01 13:34:37 25 4
gpt4 key购买 nike

我正在构建一个新的网络应用程序,LAMP 环境...我想知道是否可以信任 preg_match 用于所有基于文本的字段(也不是 HTML 字段)的用户输入验证(当然是 + 准备好的 stmt;电话、姓名、姓氏等)。

例如,对于经典的“电子邮件字段”,如果我检查如下输入:

$email_pattern = "/^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)" .
"|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}" .
"|[0-9]{1,3})(\]?)$/";

$email = $_POST['email'];
if(preg_match($email_pattern, $email)){
//go on, prepare stmt, execute, etc...
}else{
//email not valid! do nothing except warn the user
}

我可以高枕无忧地对抗 SQL/XXS 注入(inject)吗?

我将正则表达式写得尽可能地严格。

编辑:如前所述,我确实已经使用了准备好的语句,这种行为仅适​​用于基于文本的字段(如电话、电子邮件、姓名、姓氏、等..),因此不允许任何内容包含 HTML(对于 HTML 字段,我使用 HTMLpurifier)。

实际上,我的任务是让输入值仅在匹配我的正则表达式白名单时通过;否则,返回给用户。

p.s:: 我正在寻找没有 mysql_real_escape_strings 的东西;估计以后项目会转成Postgresql,所以需要一个跨库的验证方式;)

最佳答案

正则表达式是否足以过滤取决于正则表达式。如果要在 SQL 语句中使用该值,则正则表达式必须以某种方式禁止 '" .如果你想在 HTML 输出中使用该值并且害怕 XSS,你必须确保你的正则表达式不允许 < , >" .

不过,正如已经反复说过的那样,您确实不想依赖正则表达式,看在$deity 的份上,请不要!使用 mysql_real_escape_string() prepared statements用于您的 SQL 语句,以及 htmlspecialchars() 用于在 HTML 上下文中打印时的值。

根据上下文选择清理函数。作为一般经验法则,它比您更清楚什么是危险的,什么是不危险的。


编辑,以适应您的编辑:

数据库

Prepared statements == mysql_real_escape_string() 在每个要放入的值上。本质上是完全一样的,除了在 prepared statements 变体中有性能提升,并且不会意外忘记使用对其中一个值起作用。不过,准备好的语句是保护您免受 SQL 注入(inject)攻击的,而不是正则表达式。您的正则表达式可以是任何内容,并且对准备好的语句没有影响。

您不能也不应该尝试使用正则表达式来适应“跨数据库”架构。同样,通常系统比你更清楚什么对它来说是危险的,什么不是危险的。准备好的语句很好,如果它们与更改兼容,那么您就可以高枕无忧了。没有正则表达式。

如果它们不是,而你必须,对你的数据库使用一个抽象层,比如自定义 $db->e​​scape(),它在你的 MySQL 架构中映射到 mysql_real_escape_string( ) 并且在您的 PostgreSQL 体系结构中映射到 PostgreSQL 的相应方法(我不知道哪个是副手,抱歉,我没有使用过 PostgreSQL)。

HTML

HTML Purifier 是清理 HTML 输出的好方法(前提是你在白名单模式下使用它,这是它附带的设置),但你应该只在你绝对需要保留 HTML 的地方使用它,因为调用purify() 非常昂贵,因为它解析整个事物并以旨在彻底和强大规则集的方式对其进行操作。因此,如果您不需要保留 HTML,则需要使用 htmlspecialchars()。但是,在这一点上,您的正则表达式与您的转义无关,可以是任何东西。

安全旁注

Actually, my mission is to let pass the input value only if it match my regexp-white-list; else, return it back to the user.

这可能不适用于您的场景,但作为一般信息:“将错误的输入返回给用户”的理念可能会让您面临 reflected XSS 的风险攻击。用户并不总是攻击者,因此在将东西返回给用户时,请确保你仍然将其转义。只是要记住一些事情。

关于php - preg_match 在输入缎化中是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2622856/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com