Php 你能破解这个输入净化功能吗?

Php 你能破解这个输入净化功能吗?,php,forms,input,sanitize,Php,Forms,Input,Sanitize,我还在学习PHP和SQL。我正在尝试为网站的事件列表创建一个简单的内容管理系统。所有输入表单字段都是文本区域或文本框(是的,我希望这样),我希望用户能够在这些字段中添加文本之外的HTML链接。下面的函数似乎是一个很好的开始,可以对我从用户那里得到的输入进行清理,但是由于我对这一点还不熟悉,所以我想得到知识更丰富的开发人员的意见。我还应该做些什么来保护数据库 另外,感谢您提供这些功能 function cleanInput($input) { $search = array(

我还在学习PHP和SQL。我正在尝试为网站的事件列表创建一个简单的内容管理系统。所有输入表单字段都是文本区域或文本框(是的,我希望这样),我希望用户能够在这些字段中添加文本之外的HTML链接。下面的函数似乎是一个很好的开始,可以对我从用户那里得到的输入进行清理,但是由于我对这一点还不熟悉,所以我想得到知识更丰富的开发人员的意见。我还应该做些什么来保护数据库

另外,感谢您提供这些功能

function cleanInput($input) {

    $search = array(
         '@<script[^>]*?>.*?</script>@si',   // Strip out javascript
         '@<style[^>]*?>.*?</style>@siU',    // Strip style tags properly
         '@<![\s\S]*?--[ \t\n\r]*>@'         // Strip multi-line comments
    );

    $output = preg_replace($search, '', $input);
    return $output;
}

function sanitize($input) {
    if (is_array($input)) {
       foreach($input as $var=>$val) {
          $output[$var] = sanitize($val);
       }
    }
    else {
       if (get_magic_quotes_gpc()) {
          $input = stripslashes($input);
       }
       $input  = cleanInput($input);
   $output = htmlentities($output);
       $output = mysql_real_escape_string($input);
     }
     return $output;
}
函数cleanInput($input){
$search=array(
'@]*?>.@si',//去掉javascript
“@]*?>.*?@siU”,//条形样式标记正确
'@@'//带多行注释
);
$output=preg_replace($search,,$input);
返回$output;
}
函数清理($input){
if(is_数组($input)){
foreach($var=>$val的输入){
$output[$var]=消毒($val);
}
}
否则{
如果(获取\u魔术\u引号\u gpc()){
$input=条带斜杠($input);
}
$input=cleanInput($input);
$output=htmlentities($output);
$output=mysql\u real\u escape\u字符串($input);
}
返回$output;
}
非常容易:

$testinput = "<script>alert('p0wned');</script >\n
    <a href='http://example.org' onclick=\"alert('p0Wned again!)\">Click me!</a>";

var_export(cleanInput($testinput));
更好的方法是,尝试使用一个模板库,它可以为您自动转义字符串,并且要求您显式关闭转义。(常见的情况应该很简单,以避免错误,而必须转义是常见的情况!)

  • html页面是从模板返回的字符串。您现在可以向用户显示它

  • 虽然您不必清理您自己在浏览器中显示或存储在数据库中的字符串数据,但您必须清理您的网站通过输入元素、文本区域元素、通过JavaScript/DOM事件从键盘获得的所有用户输入、上传的文件,还有我忘了列出的所有其他来源

    虽然数据库清理有很好的文档记录,并且在最新版本的服务器端语言(如PHP)中部分实施,但仍然没有一种普遍接受的方法来清理我列出的其他用户输入源

    我自己的贡献是这段PHP代码,它允许任何用户输入显示在网页上,或通过表单元素中的GET或POST控件和字段或通过Ajax发送到另一个网页,而不会打开网站让恶意用户使用:

    function HTMLToSafeHTML($Str)
        {
        return str_replace(['&','<','>','"','\''], ['&amp;','&lt;','&gt;','&quot;','&apos;'], $Str);
        } // HTMLToSafeHTML
    
    函数HTMLToSafeHTML($Str)
    {
    返回str_replace(['&','''''','\'','&;'','''','''','&apos;'],$str);
    }//HTMLToSafeHTML
    
    要正确使用此函数,必须识别和跟踪所有用户输入,然后在显示或允许将用户输入解释为Web处理或编程的一部分之前调用此函数。识别用户输入只允许您调用此函数一次。多次调用它将显示其难以读取的编码,这与文本无关


    例如,如果要显示以黑体显示某些用户输入的错误消息,则必须在用户输入中调用HTMLToSafeHTML(您可以给出一个较短的名称),然后将其包含在
    ..
    中以使其成为黑体。虽然显示“
    ”是无害的,但显示用户输入可能是恶意用户故意闯入您的网站以传播病毒或出于其他邪恶目的而造成的结果,却绝不是无害的。

    除了
    mysql\u real\u escape\u string()
    之外,所有这些都是无用的垃圾。这是唯一能保护你的数据库的东西。。。直到它从PHP中删除,因为它是一个不推荐使用的函数。你只是把厨房的水槽扔向了这个问题。当你处理db时,你不需要html/js过滤垃圾。@Marc B今天在一次撕裂中。你不需要解释允许任意js的
    html属性,也不需要解释
    行为
    IE CSS属性,它可以做很多坏事,而且很可能以绕过正则表达式的方式嵌套脚本标记。@francis:那么每种类型的清理都应该有专用的函数。这段代码和PHP最初愚蠢的假设“PHP永远不会用于数据库查询之外的任何东西,所以让我们添加slashes()EVERYTHING!”一样有用。毫无疑问,这段代码很糟糕。上面的所有注释都很有趣,但也很混乱。关于如何处理表单中的输入,有太多的信息和不同的观点。我很难从中找到一个好的学习基础。建议?为了直接回应你的答案,你上面的代码是如何破解函数的?var_export将显示$testinput变量的值,但如果我正确理解该函数,该变量中的脚本标记将被剥离。是的,我计划在输出时解码HTML字符。用户需要能够向数据库添加HTML链接,以便在打印时正确呈现。@Leann关闭脚本标记中有一个空格。正则表达式不会匹配的。啊,我没看到。对不起。@Leann,我用处理web输入和输出的最佳实践扩展了答案。
    
    function HTMLToSafeHTML($Str)
        {
        return str_replace(['&','<','>','"','\''], ['&amp;','&lt;','&gt;','&quot;','&apos;'], $Str);
        } // HTMLToSafeHTML