在这种情况下如何使用 PHP (http://my_host_here.com/publications.php/"><script>alert(1)</script

Posted

技术标签:

【中文标题】在这种情况下如何使用 PHP (http://my_host_here.com/publications.php/"><script>alert(1)</script>) 防止 javascript?【英文标题】:how do I prevent javascript in this situation using PHP (http://my_host_here.com/publications.php/"><script>alert(1)</script>)? 【发布时间】:2013-02-11 07:47:59 【问题描述】:

我已经尝试了下面的代码,但似乎在将 http 请求发送到服务器之前运行了 javascript

谢谢

<?php

class secure

    function secureSuperGlobalGET(&$value, $key)
    
        $_GET[$key] = htmlspecialchars(stripslashes($_GET[$key]));
        $_GET[$key] = str_ireplace("script", "blocked", $_GET[$key]);
        $_GET[$key] = mysql_escape_string($_GET[$key]);
        return $_GET[$key];
    

    function secureSuperGlobalPOST(&$value, $key)
    
        $_POST[$key] = htmlspecialchars(stripslashes($_POST[$key]));
        $_POST[$key] = str_ireplace("script", "blocked", $_POST[$key]);
        $_POST[$key] = mysql_escape_string($_POST[$key]);
        return $_POST[$key];
    

    function secureGlobals()
    
        echo "in here";
        array_walk($_GET, array($this, 'secureSuperGlobalGET'));
        array_walk($_POST, array($this, 'secureSuperGlobalPOST'));
    


?>

【问题讨论】:

不确定您要在这里做什么。你只是把那些可怜的字符串弄得面目全非 :) 总是为了手头的任务而逃避only。你能澄清一下你在什么情况下试图阻止什么吗? 见The ultimate clean/secure function 你之后如何使用这些值?您是将它们存储在数据库中还是将它们打印给用户? 如果在请求发送到服务器之前发生了一些事情,你需要发布 HTML/Javascript 代码。 【参考方案1】:
    摆脱你的“安全”类 使用mysql_[real_]escape_string 作为进入 SQL 查询的值作为带引号的字符串 任何其他 SQL 部分都必须根据其角色进行格式化。 在组装查询之前格式化 SQL 部分,而不是其他任何地方。 或更好地使用占位符

最后,回答您的问题:在回显用户提交的值时使用 htmlspecialchars()。

【讨论】:

【参考方案2】:

如果 Javascript 在代码返回服务器之前运行,那么这很可能是某种形式的基于 DOM 的 XSS。 Javascript 可能会提取 /"&gt;&lt;script&gt;alert(1)&lt;/script&gt; 的值并将其直接放入 DOM。您可能必须更改在客户端处理此问题的方式。

OWASP 对如何防御基于 DOM 的跨站点脚本攻击进行了精彩的概述,例如:https://www.owasp.org/index.php/DOM_based_XSS_Prevention_Cheat_Sheet

【讨论】:

以上是关于在这种情况下如何使用 PHP (http://my_host_here.com/publications.php/"><script>alert(1)</script的主要内容,如果未能解决你的问题,请参考以下文章

在这种情况下如何使用 lastInsertId?

在这种简单的情况下,PHP 拒绝接受返回类型的原因是啥?

在这种特殊情况下在 PHP 脚本之间传递值

在这种情况下如何转义单引号? [复制]

在这种情况下如何获取两个字符之间的字符串?

为啥在 Laravel 的这种情况下 route() 有效?