The*_*can 53 php mysql security connection pdo
我有一个简单的网站,我使用PDO建立与Mysql服务器的连接.
$dbh = new PDO('mysql:host=localhost;dbname=DB;port=3306', 'USER',
'SECRET',array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
Run Code Online (Sandbox Code Playgroud)
我的网站上有一些流量,达到服务器连接限制,网站抛出此错误,其中包含我的PLAIN密码!
致命错误:/home/domain/html/index.php:xxx中带有消息"SQLSTATE [08004] [1040]连接太多"的未捕获异常"PDOException"堆栈跟踪:#0 /home/domain/html/index.php (64):PDO - > __ construct('mysql:host = loca ...','USER','SECRET',Array)在第64行的/home/domain/html/index.php中抛出#1 {main}
具有讽刺意味的是,出于安全考虑我转向PDO,所以这让我感到震惊,因为这个确切的错误是你可以在大多数使用简单的http泛滥的网站上轻易引起的.
我现在已将我的连接包装在try/catch块中,但我认为这仍然是灾难性的!
我是PDO的新手,所以我的问题是:我需要做些什么来考虑安全?如何以安全的方式建立连接?是否还有其他已知的安全漏洞,我必须注意这个漏洞?
Bra*_*rad 21
display_errors = off无论如何你应该在你的PHP.ini中避免这个问题.除了PDO之外,揭示这些细节的错误来自许多地方.
是的,您还应该在try/catch块中使用它.
您也可以$pdo->setAttribute(PDO::ERRMODE_SILENT),但是您需要手动检查错误代码而不是使用try/catch块.有关更多错误常量,请参见http://php.net/manual/en/pdo.setattribute.php.
Mat*_*ias 15
简单的解决方法是捕获PDO构造函数抛出的PDOException:
try {
$dbh = new PDO('mysql:host=localhost;dbname=DB;port=3306', 'USER',
'SECRET',array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
} catch (PDOException $e) {
throw new Exception($e->getMessage());
}
Run Code Online (Sandbox Code Playgroud)
好吧,这让我有点傻笑,错误报告的使用是出于调试目的,它允许您快速查找和修复问题.
当您处于实时环境中时,您的服务器应该仅配置为内部日志记录,而不是直接输出,因此基本上您需要关闭您的服务器中的错误输出php.ini.
display_errors = Off
Run Code Online (Sandbox Code Playgroud)
但是当你在测试环境中时,这个堆栈只是一个可以帮助你的工具,并且是可配置的.
当在实时环境中发生错误时,它们将被记录,因此您应始终检查日志文件,然后进行相应的修复.
人们可能会指定您可以管理PHP应用程序中的错误,但是根据个人喜好,我认为这是错误的方法,为您的Web服务器和MySQL/MsSQL配置INI和配置文件将导致更严格的管理.
如果您的应用程序是公共应用程序,那么处理应用程序中的错误也是一个好主意,因为大部分客户端可能在共享主机上,并且没有对服务器配置的完全访问权限.
| 归档时间: |
|
| 查看次数: |
9148 次 |
| 最近记录: |