提高php页面安全性的基本要点是什么?

提高php页面安全性的基本要点是什么?,php,sql,security,database-connection,Php,Sql,Security,Database Connection,关于php中get和post函数的一些安全点。还有关于php中的sql连接,这样我就可以从crakers那里保存我的网站。这里是Steve在本博客中介绍的一些基本安全技巧,我希望你会发现这些技巧对你的探索有用 更新 上面的链接已经冗余了一段时间,但以下是本文中涉及的一些细节: 1。输入筛选 假设所有东西都是脏的,直到证明干净为止。从外部源筛选所有数据可能是您可以采取的最重要的安全措施。这就像在变量上运行一些简单的内置函数一样简单 在接受用户输入时,切勿直接使用$\u GET或$\u POST中

关于php中get和post函数的一些安全点。还有关于php中的sql连接,这样我就可以从crakers那里保存我的网站。

这里是Steve在本博客中介绍的一些基本安全技巧,我希望你会发现这些技巧对你的探索有用


更新 上面的链接已经冗余了一段时间,但以下是本文中涉及的一些细节:

1。输入筛选

假设所有东西都是脏的,直到证明干净为止。从外部源筛选所有数据可能是您可以采取的最重要的安全措施。这就像在变量上运行一些简单的内置函数一样简单

在接受用户输入时,切勿直接使用
$\u GET
$\u POST
中的任何内容。检查每个值以确保它是预期值,并将其分配给局部变量以供使用

// input filtering examples

// Make sure it is an integer
$integer = intval($_POST['variable_name']);

// Make it safe to use in a URL
$url_string = urlencode($_POST['variable_name']);
You can also check a value against a list of acceptable values. Here are two methods of doing this:

$page = 'home'; // initialize the variable

// Check input against a white-list of known options
$valid_options = array();
$valid_options[] = 'home';
$valid_options[] = 'downloads';
$valid_options[] = 'about';

if(in_array($_GET['page'], $valid_options))
{
   $page = $_GET['page'];
}

// OR this also works
switch($_GET['page'])
{
   case 'home':
   case 'downloads':
   case 'about':
      $page = $_GET['page'];
      break;
}
从5.2版起,PHP提供了一组过滤函数,这些函数的设计目的就是过滤用户数据。
filter\u input()
函数用于访问输入变量的过滤版本。这样,您就不必通过
$\u GET
$\u POST
数组触摸原始输入

// filter_input examples

// Make sure it is an integer
$integer = filter_input(INPUT_POST, 'variable_name', FILTER_SANITIZE_NUMBER_INT);

// Make it safe to use in a URL
$url_string = filter_input(INPUT_POST, 'variable_name', FILTER_SANITIZE_ENCODED);

// Make sure it is a valid URL
$url = filter_input(INPUT_POST, 'variable_name', FILTER_VALIDATE_URL);
2。输出过滤

过滤应用程序中的内容也很重要。您希望避免输出错误的字符并中断页面呈现。为了阻止恶意用户注入JavaScript的某些攻击,这一点也很重要。要清除要显示给用户的文本,需要了解一些功能:

$text = '<a href="test">Test</a>';
echo htmlspecialchars($text); // &lt;a href=&quot;test&quot;&gt;Test&lt;/a&gt;
echo strip_tags($text); // Test
4。隐藏错误

向世界展示你的错误从来都不是一个好主意。这不仅会让你看起来很糟糕,还可能给恶意用户提供另一条线索,帮助他们破坏你的网站。您应该始终在生产环境中禁用
display_errors
,但继续使用
log_errors
记录错误,以获取您自己的信息

这些PHP配置指令适用于生产服务器:

display_errors 0
log_errors 1
5。使用POST进行危险操作

向PHP应用程序发送数据有两种常用方法,
GET
POST
GET
通过在URL的末尾添加变量(例如
http://www.example.com/process.php?action=delete&id=123
POST
通过在请求主体中发送变量来工作(普通用户不会看到它们)。重要的是仔细考虑对某个任务使用哪种方法。

当你执行一个潜在的危险动作(比如删除某些东西)时,你通常应该坚持使用POST。原因是,诱骗用户使用GET参数访问URL要比诱骗用户发送POST请求容易得多。举个例子:

<img src="http://www.example.com/process.php?action=delete&id=123" />

如果在您的站点上有活动会话的用户使用上述图像标记访问另一个网页,则用户的浏览器将悄悄地向您的站点发送请求,告知其删除记录123


请记住,还应采取其他预防措施,以确保请求在安全会话下是合法的。使用POST请求也很容易创建一个与上面相同的表单,所以也不要假设该方法是“安全的”

关于SQL,请确保它只在localhost 127.0.0.1上侦听。这已经是MySQL的默认设置好几年了,但是旧的安装习惯于监听外部世界,从而暴露您的服务器。我知道这只回答了你的部分问题,但我个人不相信PHP是安全的。

如果你想保护你的应用程序不受SQL注入的影响,你必须在代码中使用以下函数:

  • intval():从get或Post获取int值
  • floatval():获取浮动
  • doubleval():获取双打
对于字符串值,可以使用以下函数之一:

  • addslashes():如果您还没有任何数据库连接
  • mysql\u real\u escape\u string():如果您正在使用mysql,php会在将字符串输入发送到数据库之前为您测试字符串输入
我希望这些建议能对你有所帮助,因为它们对我帮助很大

问候

这完全取决于你想投入多少努力。如果你想要第一原则,其他答案已经提供了一些线索。但是如果你想提供安全保证

完全覆盖web安全主题需要一本书的信息,因此这不能通过博客帖子或回复来实现

一个好的开始是查看的详细验证需求。ASVS是在发布web应用程序之前验证其安全性的标准。级别1是您必须能够声明应用程序安全性的最低安全级别。如果没有,你根本无法知道该应用程序是否完全开放

其他OWASP项目也很有帮助:

  • (不完整)
  • (安全API有助于正确实施最佳实践)

这是我见过的最全面的PHP应用程序安全检查表


如果我可以问的话,为什么PHP不能是安全的?因为没有任何语言是安全的,而PHP是一种随着增长而增长的语言,这一点在我看来就不那么安全了。这只是一个信念,没有数据支持。链接不存在。另外,如果你提供链接,把它作为评论而不是答案
<img src="http://www.example.com/process.php?action=delete&id=123" />