(PHP)验证、安全和速度-我的应用程序有这些功能吗?
我目前正在用PHP开发一个建筑社区网站。它包含用户可以从注册到许多其他功能都直接填写的表单。我不是一个面向对象的人,所以我大部分时间都在使用函数来处理我的应用程序。我知道我必须学习OOPS,但目前需要开发这个网站并尽快运行 无论如何,这里有一个我让我的应用程序的例子。做: 考虑一个页面(登记。php),它有一个表单,用户有3个字段来填充,比如:名字,姓氏和电子邮件。提交此表单后,我希望验证表单并向用户显示相应的错误:(PHP)验证、安全和速度-我的应用程序有这些功能吗?,php,security,performance,validation,Php,Security,Performance,Validation,我目前正在用PHP开发一个建筑社区网站。它包含用户可以从注册到许多其他功能都直接填写的表单。我不是一个面向对象的人,所以我大部分时间都在使用函数来处理我的应用程序。我知道我必须学习OOPS,但目前需要开发这个网站并尽快运行 无论如何,这里有一个我让我的应用程序的例子。做: 考虑一个页面(登记。php),它有一个表单,用户有3个字段来填充,比如:名字,姓氏和电子邮件。提交此表单后,我希望验证表单并向用户显示相应的错误: <form id="form1" name="form1" method
<form id="form1" name="form1" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<label for="name">Name:</label>
<input type="text" name="name" id="name" /><br />
<label for="lname">Last Name:</label>
<input type="text" name="lname" id="lname" /><br />
<label for="email">Email:</label>
<input type="text" name="email" id="email" /><br />
<input type="submit" name="submit" id="submit" value="Submit" />
</form>
好的,现在看起来可能有很多,但让我按目标细分:
标记,并删除所有其他内容。剩下的是显而易见的
我暂缓使用面向对象的方法,并在PHP中使用过滤器,以备以后使用。所以,请大家向我建议改进/调整当前方式的方法,并建议我脚本是否易受攻击或足够安全,可以在实时生产环境中使用。如果没有,我能做些什么才能实时使用它?回答您的问题:
$\u POST
和$\u获取
值,而不是一次全部清除。换句话说,我会在val\u rules()
中的$str
上调用clean()
。此外,我发现使用include()
或require()
拉入脚本,然后意识到该脚本在“幕后”执行并执行某些功能时,这确实令人困惑。我想您会发现,当所拉入的文件仅用于声明函数、常量和类时,使用include()
或require()
效果最好。重要的是能够清楚地“公开地”跟踪所有执行,也就是说,在实际执行某些工作的页面上。类似地,我不允许fn\u register()
函数直接访问$\u POST
数组而不将其作为参数传入。在阅读一些代码时能够查看函数,并立即查看它所作用的数据,而不必查看函数定义,这一点很重要。换句话说,函数作用的所有数据在理想情况下都应该作为值传入。最后,这是一个主要问题,您的姓名验证太严格了。它不会容忍连字符、撇号、重音字符等。我想你会发现,在名称验证方面自由是最好的策略。例如,一些文化的命名约定甚至没有我们认为的名字和姓氏。另一个问题:不要使用“required”和“optional”,而是为required使用布尔值。如果设置为TRUE
,则该字段为必填字段您的脚本在第一行容易受到跨站点脚本攻击。$\u SERVER['PHP\u SELF']的值不可信。你必须过滤它。下面是一个简单的修复方法:
<form id="form1" name="form1" method="post" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF'], ENT_QUOTES, 'utf-8'); ?>">
查看是否会弹出警报
更新:至少在PHP5.3中,您的代码片段似乎不易受XSS攻击。但是,我不能保证(你也不能保证)PHP_SELF将在旧版本的PHP中产生什么,或者在将来产生什么。PHP\u SELF的值必须进行编码。如果禁用magic\u quote,则只需添加斜杠;如果启用magic\u quote,则删除斜杠,但不能同时添加斜杠和删除斜杠。如果我是你,我会选择第二种方式。谢谢你让我知道。嗨,谢谢你的回复。以下是我对你的3点的回答。1.是否有任何工具可以编写命令行驱动的测试su
<form id="form1" name="form1" method="post" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF'], ENT_QUOTES, 'utf-8'); ?>">
http://site.com/page.php?a=%22onload%3D%22javascript%3Aalert('XSS')%22