他们基本上是可以攻击您的系统的两类人
以下是我们需要注意的攻击类型。
SQL注入–这种类型的攻击将有害代码附加到SQL语句中。
这可以通过用户输入表单或使用变量的URL来完成。
后面的代码注释了SQL语句的WHERE子句中的条件。附加的代码也可以;
Cross-site scripting 跨站点脚本编写-这种类型的攻击通常会插入有害代码,通常是JavaScript。这可以通过用户输入表格(例如联系我们和评论表格)来完成。这样做是为了;
现在,让我们看一下在开发应用程序时必须考虑的一些PHP安全最佳实践。
PHP strip_tags
strip_tags函数从字符串中删除HTML,JavaScript或PHP标记。
当我们必须保护我们的应用程序免受诸如跨站点脚本攻击之类的攻击时,此功能很有用。
让我们考虑一个接受用户评论的应用程序。
<?php
$user_input = "Your site rocks";
echo "<h4>My Commenting System</h4>";
echo $user_input;
?>
假设您已将comment.php保存在phptuts文件夹中,请浏览至URL http://localhost/phptuts/comments.php
假设您在用户输入 alert(’您的网站很烂!’); </ script>时收到以下消息</p>
<?php
$user_input = "<script>alert('Your site sucks!');</script>";
echo "<h4>My Commenting System</h4>";
echo $user_input;
?>
浏览到URL http://localhost/phptuts/comments.php
现在,使用strip_tags函数保护我们的应用程序免受此类攻击。
<?php
$user_input = "<script>alert('Your site sucks!');</script>";
echo strip_tags($user_input);
?>
浏览到URL http://localhost/phptuts/comments.php
filter_var函数用于验证和清理数据。
验证检查数据是否为正确的类型。 对字符串进行数字验证检查会返回错误的结果。
清理操作是从字符串中删除非法字符。
检查此链接以获取完整的参考filter_var
该代码用于注释系统。
它使用filter_var函数和FILTER_SANITIZE_STRIPPED常量剥离标签。
<?php
$user_input = "<script>alert('Your site sucks!');</script>";
echo filter_var($user_input, FILTER_SANITIZE_STRIPPED);
?>
Output:
alert('Your site sucks!');
mysqli_real_escape_string函数此函数用于保护应用程序免受SQL注入。
假设我们有以下用于验证用户ID和密码的SQL语句。
<?php
SELECT uid,pwd,role FROM users WHERE uid = 'admin' AND password = 'pass';
?>
恶意用户可以在用户ID文本框中输入以下代码。 ‘OR 1 = 1-在密码文本框中输入1234,然后对身份验证模块进行编码
<?php
$uid = "' OR 1 = 1 -- ";
$pwd = "1234";
$sql = "SELECT uid,pwd,role FROM users WHERE uid = '$uid' AND password = '$pwd';";
echo $sql;
?>
最终结果将是
SELECT uid,pwd,role FROM users WHERE uid = '' OR 1 = 1 -- ' AND password = '1234';
这里,
上面的查询将返回所有用户。现在使用mysqli_real_escape_string函数来保护我们的登录模块。
<?php
$uid = mysqli_real_escape_string("' OR 1 = 1 -- ");
$pwd = mysqli_real_escape_string("1234");
$sql = "SELECT uid,pwd,role FROM users WHERE uid = '$uid' AND password = '$pwd';";
echo $sql;
?>
上面的代码将输出
SELECT uid,pwd,role FROM users WHERE uid = '\' OR 1 = 1 -- ' AND password = '1234';
请注意,第二个单引号已为我们转义,它将被视为用户ID的一部分,并且密码不会被注释。
Md5是Message Digest 5的缩写,而sha1是Secure Hash Algorithm 1的缩写。
它们都用于加密字符串。
一旦字符串被加密,解密就很繁琐。
在数据库中存储密码时,Md5和sha1非常有用。
下面的代码显示了md5和sha1的实现
<?php
echo "MD5 Hash: " . md5("password");
echo "SHA1 Hash: " . sha1("password");
?>
假设您已将hashes.php文件保存在phptuts文件夹中,请浏览至URL
从上面的散列中可以看出,如果攻击者获得了对您数据库的访问权限,他们仍然不知道用于登录的密码。