在 PHP 中验证用户输入的简单方法

A simple approach of validating user input in PHP

提问人:mvnds1605 提问时间:11/23/2020 最后编辑:mvnds1605 更新时间:11/24/2020 访问量:203

问:

我对PHP和SQL安全很陌生,我正在考虑一种验证/过滤用户输入的解决方案。

据我了解,您主要需要担心两件事:(1)有人将SQL查询注入到与数据库
交互的输入字段中(2)有人将标签之类的东西放入他们的输入中,
然后再次打印到页面上
<script>

在研究过程中,我发现了以下解决方案:
对于(1):准备好的语句
对于(2):验证/过滤HTML标签

我知道您必须验证/过滤任何用户输入,据我了解,大多数安全漏洞都是由于这样做的错误而存在的。 例如,只需在以下输入中过滤掉标记:<script>

email@<sc<script>ript>example.com

那么,一个非常简单的算法拒绝任何包含“<”或“>”的用户输入(假设用户没有理由使用这些符号),并将用户输入内部的内容替换为允许特定标签呢?这不是防止恶意 HTML 内容的防弹方法吗,或者我错过了什么?[b]<b>

另外,我想知道是否一直使用预处理语句会使SQL注入变得不可能,或者仍然可以在专门使用预处理语句的页面上进行SQL注入?

php 验证 安全性 xss sql 注入

评论

0赞 pavel 11/23/2020
1:PDO,2:htmlspecialchars
0赞 Sachin Kumar 11/24/2020
PDO驱动保存数据,strip_tags函数进行发送,设置磁头字符集为UTF-8。
0赞 M. Eriksson 11/24/2020
对于 SQL 注入,请使用参数化的预准备语句。没有必要真正过滤掉任何东西(安全方面)。只需“按原样”保存数据即可。然后,当您输出数据时,您需要运行它或保护自己免受 XSS 的侵害。最好在输出数据时清理数据,因为不同的用例需要不同的卫生条件。验证应该始终进行,但这是为了检查数据是否正确,检查发送的数据是否采用正确的格式等,并且与卫生或安全无关。htmlentities()htmlspecialchars()
0赞 M. Eriksson 11/24/2020
...而且你不应该尝试想出你自己的卫生类型(比如移除和。黑客有很多伎俩来绕过“不复杂”的卫生设施(你基本上需要知道所有可能的攻击媒介,才能依靠你自己的解决方案。请改用 PHP 中的内置函数,多年来,它们已经被数百万人尝试和测试。<>

答:

0赞 Martijn 11/23/2020 #1

你可以这样做,是的。但这样一来,你可能会受到另一次攻击。你可以解决这个问题,但你仍然可能......

正因为如此,将白名单列入白名单更容易。只允许某些字符(尽管允许使用更广泛的字符集),您可以简单地只允许这些字符。

基本逻辑是电子邮件仅包含 和 。如果使用了该集合之外的任何字符,则是错误的。a-z0-9-_.@

从那里,您可以指定更多。电子邮件是一组字符(减去 @),然后是 ,然后是字符集(减去 @)。
从那里,您可以添加域检查,例如(必须以点结尾,至少以字母结尾)。
从那里...
@\.{2,}$

而这只是节省的部分。在展示时,您需要各种技巧来确保它不是 XSS。


或者你可以只使用

if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    echo "Not an emailaddress, please try again before submitting!"; 
}

评论

1赞 pavel 11/24/2020
电子邮件地址呢?A-Z?“基本逻辑是电子邮件只包含 a-z 0-9 - _ 。而@'根本不是真的。+
0赞 Martijn 11/24/2020
这是一个完美的例子,为什么这种方法效果不佳!我还错过了什么?非常敏感的逻辑x