PHP表单欺骗和验证

PHP表单欺骗和验证,php,forms,validation,sanitization,spoofing,Php,Forms,Validation,Sanitization,Spoofing,我一直在阅读有关表单欺骗的文章,但我不明白为什么在我们能够确保传递的值得到正确验证的情况下,防止表单欺骗如此重要?也许我遗漏了一些东西,但这里有一个例子: example.org/form.html: <form method="post" action="post.php"> <input type="text" name="content" value="something"> <input type="submit" name="post" v

我一直在阅读有关表单欺骗的文章,但我不明白为什么在我们能够确保传递的值得到正确验证的情况下,防止表单欺骗如此重要?也许我遗漏了一些东西,但这里有一个例子:

example.org/form.html:

<form method="post" action="post.php">
    <input type="text" name="content" value="something">
    <input type="submit" name="post" value="Post">
</form>
恶意用户可以简单地将form.html中的输入字段更改为,例如,
此处的某个内容
,但这会如何影响任何内容?无论如何,我们都要确保从post.php脚本中的字符串中剥离标记


因此,我的问题是:假设通过适当的输入验证,PHP表单欺骗在安全性方面应该没有什么危险,这安全吗?恶意用户还可以通过
name=“content”
属性(除了textarea、select和所有其他标记)向脚本传递什么,从而有效破坏数据库或其他东西?因为如果他们无能为力,为什么要使用令牌?

危险在于,如果您在SQL查询(SQL注入)中使用任何
$\u POST
内容,或者将输入直接放入
exec(…)
调用(无论如何都不是好的做法)等,只要您正在清理输入(验证/清除)没有危险。关键规则是:

永远不要相信用户的输入


特定情况下的表单授予多个攻击向量

1) sql注入攻击

未验证的数据可以包含sql代码,sql代码可以在整个数据库中修改数据、删除数据或读取数据(取决于应用程序)

2) 跨站点请求伪造(XSRF)

如果您不能确保您收到的数据实际上来自您的站点(即带有会话持久化令牌),其他站点可以复制您的网页并充当所有请求的代理

这样做的原因是,他们可以复制传输的数据。 例如,这可以用于钓鱼

3) 跨站点脚本注入

即使数据本身对您的数据库无害,并且来自您的网站,输入也可以包含javascript,每次内容显示在您的网站上时都会执行javascript。(通常可通过警报(1)或类似方式进行测试)


这可以通过剥离javascript来防止。

我正在使用PDO连接到数据库(prepare()、execute()、占位符),以防止SQL注入。还有什么需要注意的吗?SQL注入和意外代码执行是我试图防范的两大威胁。因此,基本上,确保传递给脚本的任何内容都被正确转义就足以防止表单欺骗的危险了?因为各种网站在使用代币和确保表单由正确的用户提交时都非常重视。正如您所描述的,代币可以用来防止伪造,但在这一点上真正保护的是会话劫持。。。提交表单时附带一些附加信息(会话id),使其看起来像是由合法用户提交的。这只能通过使用令牌/安全会话体系结构来防止。对于99.99%的web表单来说,这不是一个真正的问题。我知道CSRF攻击,但是,我仍然很难理解它是如何引起关注的?为什么正确的验证和清理还不够?所以我想唯一的问题是CSRF攻击,因为我正确地转义了数据,并通过对所有查询使用PDO来确保没有SQL注入。对于这个小例子,是的。有更多的攻击向量,它们的预防更加复杂。一个例子是中间人,攻击者会在表单到达用户的过程中更改表单。https可以防止这种情况,这是pci dss的一项要求。但是我没有在我的帖子中提到这一点,因为这对于一个小应用程序来说有点过头了。我正在为一个博客开发我自己的CMS,但我真的认为我不能使用https,所以我认为这样的安全措施在我的项目中有点超出范围。是的,这就是我的意思。没有https,你应该很好。
if (isset($_POST['content']))
{
    $content = filter_var($_POST['content'], FILTER_SANITIZE_STRING);
    //use $content as a sanitized variable, pass it to a database, etc.
}