【发布时间】:2019-04-16 07:44:21
【问题描述】:
我会记录对我的网站提出的每个请求。我非常清楚在执行任何包含来自查询字符串的数据的 MySQL 查询之前需要采取的安全措施。我尽可能多地从注射中清除它,到目前为止,所有测试都已成功使用:
htmlspecialchars, strip_tags, mysqli_real_escape_string。
但是在访问页面的日志中,我发现了包含大量 php 代码的失败黑客尝试的查询字符串:
?1=%40ini_set%28"display_errors"%2C"0"%29%3B%40set_time_limit%280%29%3B%40set_magic_quotes_runtime%280%29%3Becho%20%27->%7C%27%3Bfile_put_contents%28%24_SERVER%5B%27DOCUMENT_ROOT%27%5D.%27/webconfig.txt.php%27%2Cbase64_decode%28%27PD9waHAgZXZhb
在前面的例子中我们可以看到:
display_errors, set_time_limit, set_magic_quotes_runtime, file_put_contents
另一个例子:
/?s=/index/%5Cthink%5Capp/invokefunction&function=call_user_func_array&vars[0]=file_put_contents&vars[1][]=ctlpy.php&vars[1][]=<?php @assert($_REQUEST["ysy"]);?>ysydjsjxbei37$
这个最糟糕,里面甚至还有一些<?php 和$_REQUEST["ysy"] 的东西。虽然我能够对其进行清理、剥离标签并在解码字符串时对 < 或 > 进行编码,但我可以看到正在发送的请求的类型。
有没有什么办法可以检测到一个包含php代码的字符串,比如:
filter_var($var, FILTER_SANITIZE_PHP);
仅供参考:这不是一个真正的功能,我试图说明我在寻找什么。
或某种功能:
function findCode($var){
return ($var contains PHP) ? true : false
}
再说一遍,不是真的
无需清理,已处理,只需检测字符串中的 PHP 代码。我需要这个,因为我想检测它们并将它们保存在其他日志中。
注意:切勿执行或评估来自查询字符串的代码
【问题讨论】:
-
首先,不要
eval -
请不要建议他为每个查询使用一个api。在这里,安全性甚至比性能更重要。查询可能包含您确实不想发送给 Internet 上的第三方的敏感数据。
-
访问者可以通过请求提交任何查询。它可能包含 PHP,也可能包含 Javascript(想想:XSS)和可能的其他有害内容(语言、图片等)。这是活生生的事实。您可以只接受您实际需要的那些参数,然后只接受那些参数允许的值。存储每个请求并不能使您的网站更安全。确保你不做任何愚蠢的事情,做不应该被允许的事情。
-
在日志文件中包含这些内容有什么害处?就其本身而言,它只是文本。除非您明确尝试将其作为 PHP 代码执行,否则它不会执行任何操作。几乎所有攻击都归结为:不要尝试将用户输入作为 PHP/SQL/HTML 等执行。,你会没事的。
-
好的,我明白了。答案是:不,不可靠(这是简短的答案......)。您还说:“我非常清楚在执行任何包含来自查询字符串的数据的 MySQL 查询之前需要采取的安全措施。”。然而,使用
htmlspecialchars()、strip_tags()和mysqli_real_escape_string()进行消毒并不是正确的方法。最好使用prepared statements。这是an explanation。
标签: php security code-injection sanitization mysql-real-escape-string