(PHP)验证、安全和速度-我的应用程序有这些功能吗?

(PHP)验证、安全和速度-我的应用程序有这些功能吗?,php,security,performance,validation,Php,Security,Performance,Validation,我目前正在用PHP开发一个建筑社区网站。它包含用户可以从注册到许多其他功能都直接填写的表单。我不是一个面向对象的人,所以我大部分时间都在使用函数来处理我的应用程序。我知道我必须学习OOPS,但目前需要开发这个网站并尽快运行 无论如何,这里有一个我让我的应用程序的例子。做: 考虑一个页面(登记。php),它有一个表单,用户有3个字段来填充,比如:名字,姓氏和电子邮件。提交此表单后,我希望验证表单并向用户显示相应的错误: <form id="form1" name="form1" method

我目前正在用PHP开发一个建筑社区网站。它包含用户可以从注册到许多其他功能都直接填写的表单。我不是一个面向对象的人,所以我大部分时间都在使用函数来处理我的应用程序。我知道我必须学习OOPS,但目前需要开发这个网站并尽快运行

无论如何,这里有一个我让我的应用程序的例子。做: 考虑一个页面(登记。php),它有一个表单,用户有3个字段来填充,比如:名字,姓氏和电子邮件。提交此表单后,我希望验证表单并向用户显示相应的错误:

<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>

好的,现在看起来可能有很多,但让我按目标细分:

  • 我希望foreach($\u POST as&$value)和foreach($\u GET as&$value)循环遍历从用户提交的接收到的信息,并剥离/删除所有恶意输入
  • 我首先对输入调用一个名为clean的函数,以实现上述目标。此函数将处理每个输入,无论是单个字段值还是数组,只允许
    标记,并删除所有其他内容。剩下的是显而易见的
  • 一旦发生这种情况,fn_register()函数将处理新的/清除的值,并根据验证后返回的值,得到相应的错误或空值(如适用)
  • 下面是我的问题:

  • 这让我感觉很安全,因为我强迫用户更正恶意数据,并且除非更正错误,否则不会处理最终数据。我说得对吗

  • 我遵循的方法能保证速度吗(因为我使用了很多函数及其相应的调用)?表单的字段各不相同,在任何给定时间点,我在任何表单中的最小字段数可能为3个,最多可达100个(甚至更多,我不确定,因为网站仍在开发中)。以上述方式拥有100个字段及其验证是否会降低应用程序的速度(例如,多达50万用户同时访问该网站?)。如何提高速度和减少函数调用(如果可能)

  • 我能做些什么来改进当前的验证方法吗


  • 我暂缓使用面向对象的方法,并在PHP中使用过滤器,以备以后使用。所以,请大家向我建议改进/调整当前方式的方法,并建议我脚本是否易受攻击或足够安全,可以在实时生产环境中使用。如果没有,我能做些什么才能实时使用它?

    回答您的问题:

  • 粗略地检查一下,您的代码看起来确实会删除恶意数据。如果您确保将代码分解为只对作为参数传递到代码中的值进行操作的小函数,那么您可以编写一个命令行驱动的测试套件,它允许您创建大量的测试用例,您可以在对系统进行任何更改时重新运行这些测试用例,从而确信不存在任何漏洞
  • 通常,任何web应用程序最慢的部分是数据库层。在性能问题方面,设计拙劣的查询和/或过多的查询将压倒性地影响PHP代码的执行。换句话说,不要担心过度优化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