易受攻击的PHP代码示例?

Mat*_*zyk 20 php security

好的,所以我和一个朋友正在做一个关于PHP安全性的迷你演示文稿(虽然我不是真正的PHP)并且他让我找到一些易受攻击的PHP代码的例子(一个易于SQL注入和所有其他类型的攻击的代码) ).我想知道是否有任何网站都有好的和坏的代码片段显示你应该和不应该编码?

基本上我会把它们放到我们的网站上,他会尝试破解它,然后我们将展示"适当的"网站,他会再次尝试破解它.

cle*_*tus 19

SQL注入很简单:

$var = $_POST['var'];
mysql_query("SELECT * FROM sometable WHERE id = $var");
Run Code Online (Sandbox Code Playgroud)

这很容易解决:

$var = mysql_real_escape_string($_POST['var']);
Run Code Online (Sandbox Code Playgroud)

另一个常见的是XSS(跨站点脚本):

$var = $_POST['var'];
echo "<div>$var</div>\n";
Run Code Online (Sandbox Code Playgroud)

允许您注入从您的站点运行的Javascript.有几种方法可以解决这个问题,例如:

$var = strip_tags($_POST['var']);
Run Code Online (Sandbox Code Playgroud)

$var = filter_var($_POST['var'], FILTER_SANITIZE_STRING);
Run Code Online (Sandbox Code Playgroud)

  • `strip_tags`不足以停止HTML注入(想想属性值注入).使用FILTER_SANITIZE_STRING来填充请求数组是一个永远不应该使用的可怕的黑客攻击.相反,通过在放入HTML内容的每个字符串上调用`htmlspecialchars`来避免HTML注入. (17认同)
  • 现在这不公平,你知道我的左眼引发了无法控制的抽搐. (5认同)
  • 你可以用正则表达式解析它... (4认同)
  • 请注意,在这种情况下,`mysql_real_escape_string`不会阻止注入. (3认同)

Ben*_*mes 17

一个非常常见的初学者的错误是忘记在重定向后终止脚本执行.

<?php
if ($_SESSION['user_logged_in'] !== true) {
    header('Location: /login.php');
}

omg_important_private_functionality_here();
Run Code Online (Sandbox Code Playgroud)

解决方案:

if ($_SESSION['user_logged_in'] !== true) {
    header('Location: /login.php');
    exit();
}
Run Code Online (Sandbox Code Playgroud)

在普通浏览器中进行测试时可能会错过这种情况,因为浏览器通常会跟随Location标题而不会呈现脚本的任何输出.

  • 标头可以被忽略,php脚本仍然在执行.即使用户未登录,私有函数仍会执行. (3认同)

bob*_*nce 15

哦,孩子,你不会缺少例子.只是谷歌PHP教程,其中每一个都有足够的漏洞填补阿尔伯特音乐厅.

结果1,w3schools.他们的第一个包含用户输入的例子是什么?

Welcome <?php echo $_POST["fname"]; ?>!<br />
Run Code Online (Sandbox Code Playgroud)

Bzzt.HTML注入,在每个示例代码中重复.他们的第一个数据库查询是什么?

$sql="INSERT INTO Persons (FirstName, LastName, Age) VALUES ('$_POST[firstname]','$_POST[lastname]','$_POST[age]')";
Run Code Online (Sandbox Code Playgroud)

Bzzt.SQL注入,你输了.下一个.

结果2,官方PHP教程.输出变量的第一个例子是什么?

echo $_SERVER['HTTP_USER_AGENT'];
Run Code Online (Sandbox Code Playgroud)

Bzzt.HTML注入.这不是一个容易被利用的,但仍然是在php.net的学习资料中重复的那种不好的做法.

结果3,tizag.com.回声用户输入的第一个例子是什么?

echo "You ordered ". $quantity . " " . $item . ".<br />";
Run Code Online (Sandbox Code Playgroud)

Bzzt.

结果4,freewebmasterhelp.com.太基本了,包括很多,但仍然管理:

print "Hello $name"; // Welcome to the user
Run Code Online (Sandbox Code Playgroud)

Bzzt.

结果5,learnphp-tutorial.com.

<title><?= $greeting ?> World!</title>
Run Code Online (Sandbox Code Playgroud)

BZ ...

我可以继续

难道奇怪的是,野外PHP代码的一般质量是如此灾难性,当这个糟糕的垃圾是编码员学习的时候?

  • 我最喜欢的是Apress书"Pro PHP Security".作者简要介绍了常见的漏洞,并为每个漏洞提出了一个解决方案(通常是一个非常不合适的解决方案,比如通过SQL转义映射POST).然后在解决其他漏洞的其他示例中,他再次弄错了,让代码遭受他刚刚在上一章警告我们的漏洞.XSS章节甚至在其如何避免略有不同的XSS漏洞的示例中存在XSS漏洞.关于使用`eval`和`system`的相当可怕的部分.确实是"亲"安全. (2认同)

Jon*_*ley 10

鲍比表

替代文字

Bobby Tables是一个专门用于详细说明脚本通过SQL注入易受攻击的方式的页面.这不是PHP独有的,但是,SQL注入是导致许多网页漏洞的原因.

您可能希望在演示文稿中包含这些内容.