`

PHP 防止远程表单提交

    博客分类:
  • php
php 
阅读更多

Web 的好处是可以分享信息和服务。坏处也是可以分享信息和服务,因为有些人做事毫无顾忌。
以表单为例。任何人都能够访问一个 Web 站点,并使用浏览器上的 File > Save As 建立表单的本地副本。然后,他可以修改 action 参数来指向一个完全限定的 URL(不指向 formHandler.php,而是指向 http://www.yoursite.com/formHandler.php,因为表单在这个站点上),做他希望的任何修改,点击 Submit,服务器会把这个表单数据作为合法通信流接收。
首先可能考虑检查 $_SERVER['HTTP_REFERER'],从而判断请求是否来自自己的服务器,这种方法可以挡住大多数恶意用户,但是挡不住最高明的黑客。这些人足够聪明,能够篡改头部中的引用者信息,使表单的远程副本看起来像是从您的服务器提交的。
处理远程表单提交更好的方式是,根据一个惟一的字符串或时间戳生成一个令牌,并将这个令牌放在会话变量和表单中。提交表单之后,检查两个令牌是否匹配。如果不匹配,就知道有人试图从表单的远程副本发送数据。
要创建随机的令牌,可以使用 PHP 内置的 md5()、uniqid() 和 rand() 函数,如下所示:

<?php  
session_start();  
  
if ($_POST['submit'] == "go"){  
    //check token  
    if ($_POST['token'] == $_SESSION['token']){  
        //strip_tags  
        $name = strip_tags($_POST['name']);  
        $name = substr($name,0,40);  
        //clean out any potential hexadecimal characters  
        $name = cleanHex($name);  
        //continue processing....  
    }else{  
        //stop all processing! remote form posting attempt!  
    }  
}  
  
$token = md5(uniqid(rand(), true));  
$_SESSION['token']= $token;  
  
  
function cleanHex($input){  
    $clean = preg_replace("![\][xX]([A-Fa-f0-9]{1,3})!", "",$input);  
    return $clean;  
}  
?>  
  
  
<form action="<?php echo $_SERVER['PHP_SELF'];?>" method="post">  
<p><label for="name">Name</label>  
<input type="text" name="name" id="name" size="20" maxlength="40"/></p>  
<input type="hidden" name="token" value="<?php echo $token;?>"/>  
<p><input type="submit" name="submit" value="go"/></p>  
</form>   

 这种技术是有效的,这是因为在 PHP 中会话数据无法在服务器之间迁移。即使有人获得了您的 PHP 源代码,将它转移到自己的服务器上,并向您的服务器提交信息,您的服务器接收的也只是空的或畸形的会话令牌和原来提供的表单令牌。它们不匹配,远程表单提交就失败了。

分享到:
评论
1 楼 yuvista 2012-07-27  
相见恨晚,关于跨域提交,表单验证,我前段时间也在做啊,上几天刚弄完,同苦啊朋友,你也饶了不少圈子吧

咱们的思路基本一致

相关推荐

    php+Ajax远程加载防止重复提交

    - 在PHP端,一种常见的方法是在表单提交后立即禁用提交按钮,或者设置一个session变量来标记已提交的状态。这样,如果用户尝试再次提交,服务器会检查该标志并拒绝处理。 - 使用Ajax,我们可以在前端检测到提交...

    php防止站外远程提交表单的方法

    本文实例讲述了php防止站外远程提交表单的方法,分享给大家供大家参考。具体实现方法如下: 一般来说防止站长提交表单无非就是对每一次打开表单或提交数据都会需要加一个token来进行验证了,这个其实与验证码做法没...

    PHP multipartform-data 远程DOS漏洞

    1. **限制上传大小**:限制通过`multipart/form-data`提交的数据大小,防止大文件上传导致的资源耗尽。可以在PHP配置文件(php.ini)中设置`post_max_size`和`upload_max_filesize`来限制上传文件的大小。 2. **...

    PHP+Curl远程模拟登录并获取数据

    1. **收集登录信息**: 首先,需要通过浏览器的开发者工具观察登录页面的请求,找出表单提交的URL以及所需的POST参数,通常包括用户名、密码和可能的验证码。 2. **设置Curl会话**: 使用`curl_init()`创建一个新的...

    jquery表单验证

    4. 后端脚本:例如PHP、Java或其他语言,用于处理表单提交,尽管这里的重点是前端验证,但后端验证仍然是必需的,以防止恶意数据绕过前端验证。 在实际应用中,我们还需要考虑以下几点: - 错误消息的位置和样式:...

    PHP基于Linux的远程管理系统客户端的实现(源代码+论文).zip

    这可能涉及到HTTP协议处理、表单提交、数据验证和数据库交互等。 2. **Linux系统管理**:理解Linux命令行操作、文件系统结构、用户权限、进程管理、网络配置和脚本编写(如bash脚本)是实现远程管理功能的基础。 3...

    PHP 远程关机实现代码

    当用户点击“提交”按钮,表单数据会被发送到PHP脚本,脚本接收到`$_POST['cmd']`参数,然后执行相应的命令。 具体实现如下: 1. `stripslashes()`函数用于移除字符串前后的反斜杠,防止SQL注入等问题。 2. `exec...

    PHPDOS, multipart/form-data 远程dos漏洞利用程序

    在本场景中,提到的是针对multipart/form-data类型的上传请求进行的远程DoS攻击。multipart/form-data是HTTP协议中用于表单数据上传的一种格式,通常用于文件上传。 在Web开发中,服务器端需要正确处理这种类型的...

    PHP实现从远程下载文件的方法

    最后,代码提供了一个简单的HTML表单,让用户输入远程文件URL和本地保存的文件名,然后提交表单触发下载。注意,这种直接通过表单传递URL的方式存在安全风险,应使用`htmlspecialchars()`等函数防止XSS攻击,并且...

    PHP实例开发源码—小爬虫php留言板.zip

    表单提交时,PHP会处理POST请求,验证用户输入,然后将数据插入到数据库中。展示留言时,PHP会从数据库中查询数据,并将其格式化为HTML,呈现给用户。此外,考虑到安全,开发者可能还应用了防止SQL注入和XSS攻击的...

    php漏洞全解.docx

    PHP 漏洞进行剖析,涵盖命令注入、eval 注入、客户端脚本攻击、跨网站脚本攻击、SQL 注入攻击、跨网站请求伪造攻击、Session 会话劫持、Session 固定攻击、HTTP 响应拆分攻击、文件上传漏洞、目录穿越漏洞、远程文件...

    PHPmultipartform-data远程DOS利用工具

    这个标题提及的“PHP multipart/form-data远程DOS利用工具”涉及到的是一个安全问题,即如何利用PHP处理multipart/form-data请求时的漏洞来实施拒绝服务(Denial of Service,简称DOS)攻击。 拒绝服务攻击是网络...

    PHP程序常见漏洞攻击分析

    在PHP中,全局变量通常是通过用户输入(如表单提交)创建的。当用户通过GET或POST方式提交数据时,这些数据会被当作全局变量处理。攻击者可以通过直接在URL中添加参数的方式创建任意全局变量,并为其赋值,从而绕过...

    PHP实例开发源码-小爬虫php留言板.zip

    1. **前端界面**:HTML和CSS用于创建用户友好的表单,用户可以输入留言内容并提交。可能还包含JavaScript以进行客户端验证,防止无效数据提交。 2. **后端处理**:当用户提交留言时,PHP脚本接收并处理这些数据。这...

    PHPserver服务器

    - PHP与HTML的交互:使用PHP输出HTML、处理表单提交、设置cookies和session等。 - 错误和日志:理解PHP错误级别,学会查看和记录错误日志以进行调试。 - PHP安全:防止SQL注入、XSS攻击等,使用预处理语句、过滤用户...

    php和mysql web development开发第20章源代码.doc

    2. **网站表单提交处理**: - `directory_submit.html` 是一个HTML表单,用户可以输入网址和电子邮件地址提交网站。表单的提交动作指向 `directory_submit.php`。 - 在 `directory_submit.php` 中,使用 `$_...

    企业网站PHP建站系统源代码

    7. **codeimg.php**:可能是一个生成验证码的脚本,用于防止恶意自动提交,保护网站安全。 8. **config.inc.php**:配置文件,存储数据库连接信息、网站设置等敏感数据,需要妥善保管。 9. **i.php**:可能是接口...

Global site tag (gtag.js) - Google Analytics