XSS PHP输入/输出

XSS PHP输入/输出,php,xss,Php,Xss,您好,关于XSS和PHP的问题 if(filter_var($_POST['firstname'], FILTER_SANITIZE_STRING)){ $clean['firstname'] = $_POST['firstname']; }; 我正在构建一个PHP应用程序,所有输入都将通过客户端进入数据库,然后通过服务器端验证,使用filtervar进行清理……数据库中存储的加密密码,如果我键入scripttag——不管怎样——脚

您好,关于XSS和PHP的问题

 if(filter_var($_POST['firstname'], FILTER_SANITIZE_STRING)){
            $clean['firstname'] = $_POST['firstname'];
            };      
我正在构建一个PHP应用程序,所有输入都将通过客户端进入数据库,然后通过服务器端验证,使用filtervar进行清理……数据库中存储的加密密码,如果我键入scripttag——不管怎样——脚本标记,它就这样存储在数据库中,不会造成任何伤害

 if(filter_var($_POST['firstname'], FILTER_SANITIZE_STRING)){
            $clean['firstname'] = $_POST['firstname'];
            };      
XSS仅仅是直接输出输入时的一种威胁,并且使用htmlentities的唯一时间是从用户输出输入数据时

 if(filter_var($_POST['firstname'], FILTER_SANITIZE_STRING)){
            $clean['firstname'] = $_POST['firstname'];
            };      
我的应用程序不会这样做,但有没有办法让潜在攻击者注入一些恶意代码并导致其输出,即使我的编程逻辑不允许这样做

 if(filter_var($_POST['firstname'], FILTER_SANITIZE_STRING)){
            $clean['firstname'] = $_POST['firstname'];
            };      
我想把所有的基地都覆盖起来

 if(filter_var($_POST['firstname'], FILTER_SANITIZE_STRING)){
            $clean['firstname'] = $_POST['firstname'];
            };      
期待您的回答。。。。。。。。。 是的,我使用PDO准备的语句bindParam,execute来防止SQL注入,并将数据安全地存储在数据库中,我还使用:

 if(filter_var($_POST['firstname'], FILTER_SANITIZE_STRING)){
            $clean['firstname'] = $_POST['firstname'];
            };      
对于卫生处理,可在……….上进行改进

 if(filter_var($_POST['firstname'], FILTER_SANITIZE_STRING)){
            $clean['firstname'] = $_POST['firstname'];
            };      
我刚刚修复了代码,if语句阻止filter var清理脚本标记,请参见下面的内容:

 if(filter_var($_POST['firstname'], FILTER_SANITIZE_STRING)){
            $clean['firstname'] = $_POST['firstname'];
            };      
$clean =  array();
        $clean['firstname'] = (filter_var($_POST['firstname'],     FILTER_SANITIZE_STRING));


            $clean['lastname'] = (filter_var($_POST['lastname'], FILTER_SANITIZE_STRING));


            $clean['username'] = (filter_var($_POST['username'], FILTER_SANITIZE_STRING));  
现在,脚本标记不再在数据库中

输入
 if(filter_var($_POST['firstname'], FILTER_SANITIZE_STRING)){
            $clean['firstname'] = $_POST['firstname'];
            };      
如果您使用filtervar对内容进行了适当的清理或验证,那么数据库端可能没有任何问题。有时候,很难知道你是否已经覆盖了所有的基础。您的数据库查询可能仍然应该使用参数化查询来保护您

 if(filter_var($_POST['firstname'], FILTER_SANITIZE_STRING)){
            $clean['firstname'] = $_POST['firstname'];
            };      
输出
如果其他用户可以看到任何用户输入,则应正确转义目标内容类型的数据;甚至用户名之类的东西也可能是恶意的。

如果您展示一些如何使用filter_var()的代码示例,那就太好了。然而,总的来说,这里有一些事情需要考虑:

 if(filter_var($_POST['firstname'], FILTER_SANITIZE_STRING)){
            $clean['firstname'] = $_POST['firstname'];
            };      
  • filter_var()可能是一个很好的工具。此外,您还可以查看库HTMLPurifier。我在这方面取得了很多成功。目标是在坏内容进入数据库之前将其删除
  • 使用准备好的语句将数据插入数据库。虽然这在仅用于单个查询时会有一点额外的权重,但它是直接将数据插入数据库的最佳方法,而sql注入的风险最小
  • 在输出数据时使用htmlentities()和正确的编码。例如,不允许在数据库中使用UTF-8数据,而是输出ISO 8859-1输出。我总是建议确保您的文档编码、数据库和所有过滤方法都使用相同的编码,最好是UTF-8
  • 不要忘记$\u服务器在PHP中是不干净的。许多人做了大量的过滤和HTML实体,但在表单中使用未初始化版本的$\u SERVER['REQUEST\u URI']

如果您需要具体帮助,请发布代码示例。

您认为我如何使用filtervar?我使用的是ctype_alnum,但当我输入say o'reilly作为姓氏时,它在数据库中显示为null…………php中是否有更好的净化形式,但我想这取决于输入类型,以及您将使用什么…………我将看一看html净化器……谢谢,一般来说,就像我说的,我使用HTMLPurifier。我倾向于不使用filter_var()的内置清理常量。相反,我使用了回调版本,并将其传递给我自己的方法。在那里,我创建了正则表达式来删除“坏”的东西。但是,我发现我仍然错过了很多。这就是为什么最好在DB之前进行消毒,在DB之后进行过滤。:)祝你好运谢谢,我会使用HTML净化器……但现在我更喜欢自己实现,因为我还在学习原理。刚刚签出的过滤器回调看起来是一个很好的方法,可以为您提供对所需数据的特定控制。谢谢
 if(filter_var($_POST['firstname'], FILTER_SANITIZE_STRING)){
            $clean['firstname'] = $_POST['firstname'];
            };