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

Posted

技术标签:

【中文标题】在 PHP 中验证用户输入的简单方法【英文标题】:A simple approach of validating user input in PHP 【发布时间】:2021-03-06 08:44:37 【问题描述】:

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

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

在研究过程中,我发现了以下解决方案:For (1):prepared statementsFor (2): 验证/过滤 html 标记

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

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

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

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

【问题讨论】:

1:PDO,2:htmlspecialchars PDO驱动保存数据,strip_tags函数进行senitize,设置head charset为UTF-8。 关于 SQL 注入,使用参数化的预处理语句。没有必要过滤掉任何东西(安全方面)。只需“按原样”保存数据。然后当您输出数据时,您需要通过htmlentities()htmlspecialchars() 运行它来保护自己免受XSS 攻击。输出数据时最好对数据进行清理,因为不同的用例需要不同的清理。验证应该始终进行,但这是为了检查数据是否正确,检查发送的数据是否采用正确的格式等,与卫生或安全无关。 ...而且您不应该尝试想出自己的卫生设施类型(例如删除&lt;&gt;。)黑客有很多技巧可以绕过“简单”卫生(你基本上需要知道所有可能的攻击媒介才能依赖你自己的解决方案。)改用 PHP 中的内置函数,它们已经被数百万人尝试和测试了多年。 【参考方案1】:

你可以这样做,是的。但是,您可能会对另一次攻击持开放态度。你可以解决这个问题,但你可能仍然......

因此,加入白名单更容易。只允许某些字符(尽管允许更广泛的字符集),您可以只允许这些字符。

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

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

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


或者你可以使用

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

【讨论】:

电子邮件地址中的+ 怎么样? AZ? '基本逻辑是电子邮件仅包含 a-z 0-9 - _ 。而@' 根本不是真的。 这是一个完美的例子,为什么该方法不能很好地工作!我还错过了什么?非常敏感的逻辑x

以上是关于在 PHP 中验证用户输入的简单方法的主要内容,如果未能解决你的问题,请参考以下文章

PHP安全-验证

PHP安全-验证

servlet一个简单的验证输入的用户名和密码是不是和数据库的一样(不用session)

PHP 表单

php header头如何添加Authorization登录验证?

处理用户输入数据验证的更有效方法?