当前位置:  编程技术>php
本页文章导读:
    ▪php防止sql注入的方法解析      有关php防止sql注入的方法,大家都非常关注,这在日常的编程开发中,也是务必要注意的问题。 今天,再为大家介绍一些方法,供朋友们参考。 如果用户输入的数据直接插入到一个SQL语句中.........
    ▪有关php内存溢出的解决方法      一,php内存溢出 在做数据统计分析时,经常会遇到大数组,可能会发生内存溢出。 如下: 假定日志中存放的记录数为500000条,解决方案如下: ini_set(‘memory_limit’,’64M’); //重置php可以.........
    ▪php在字符断点处截断文字的代码一例      什么是断字 (word break)?,即一个单词可在转行时断开的地方。 本文介绍的函数将在断字处截断字符串。 代码如下:   代码示例: <?php //所谓断字 (word break),即一个单词可在转行时断开的.........

[1]php防止sql注入的方法解析
    来源: 互联网  发布时间: 2013-12-24

有关php防止sql注入的方法,大家都非常关注,这在日常的编程开发中,也是务必要注意的问题。
今天,再为大家介绍一些方法,供朋友们参考。

如果用户输入的数据直接插入到一个SQL语句中的查询,应用程序会很容易受到SQL注入,例如:
 

代码示例:
$unsafe_variable = $_POST['user_input'];
mysql_query()("INSERT INTO table (column) VALUES ('" . $unsafe_variable . "')");

这是因为用户可以输入类似VALUE“); DROP TABLE表; - ,使查询变成:
 

代码示例:
INSERT INTO table (column) VALUES('VALUE'); DROP TABLE table;'

如何避免这样的情况叱?
使用预备义语句和参数化查询。对于带有任何参数的sql语句都会被发送到数据库服务器,并被解析!对于攻击者想要恶意注入sql是不可能的!
有两种选择:
1.使用PDO(PHP Data Objects ):
 

代码示例:
$stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name');
$stmt->execute(array(':name' => $name));
foreach ($stmt as $row) {
// do something with $row
}

使用pdo防止sql注入的详细介绍,请参考:学习使用PDO查询Mysql来避免SQL注入风险 。

2.使用mysqli:
 

代码示例:
$stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?');
$stmt->bind_param('s', $name);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
// do something with $row
}

PDO(PHP数据对象)
注意当使用PDO访问MySQL数据库真正的预备义语句并不是默认使用的!为了解决这个问题,你必须禁用仿真准备好的语句。

使用PDO创建连接的例子如下:
 

代码示例:
$dbConnection = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'pass');
$dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

在上面例子中错误模式ERRMODE不是严格必须的,但是建议添加它。当运行出错产生致命错误时,这种方法脚本不会停止。并给开发人员捕捉任何错误的机会(当抛出PDOException异常时)。
setAttribute()那一行是强制性的,它告诉PDO禁用仿真预备义语句,使用真正的预备义语句。这可以确保语句和值在发送给MySQL数据库服务器前不被PHP解析(攻击者没有机会注入恶意的SQL).
当然你可以在构造函数选项中设置字符集参数,特别注意'老'的PHP版本(5.3.6)会在DSN中忽略掉字符集参数。

Explanation(解释)
在你传递的sql预备义语句 被数据库服务器解析和编译会发生什么?通过指定的字符(在上面例子中像a?或者像:name)告诉数据库引擎你想要过滤什么.然后调用execute执行结合好的预备义语句和你指定的参数值.

这里最重要的是,该参数值是和预编译的语句结合的,而不是和一个SQL字符串.SQL注入的工作原理是通过欺骗手段创建的SQL脚本包括恶意字符串发送到数据库.因此,通过发送实际的分开的sql参数,你会降低风险.使用准备好的语句时,你发送的任何参数,将只被视为字符串(虽然数据库引擎可能会做一些参数的优化,当然最终可能会为数字).在上面的例子中,如果变量$name包含'sarah';DELETE * FROM employees,结果只会是一个搜索的字符串"'sarah';DELETE * FROM employees",你不会得到一个空表。

另一个好处在于:如果在同一会话中多次执行相同的语句,这将只被解析和编译一次。
例子(使用PDO):
 

代码示例:
$preparedStatement = $db->prepare('INSERT INTO table (column) VALUES (:column)');
$preparedStatement->execute(array(':column' => $unsafeValue));

您可能感兴趣的文章:

PHP安全过滤代码(360提供 安全系数高)
PHP过滤post,get敏感数据的实例代码
php 过滤非法与特殊字符串的方法
php 防注入的一段代码(过滤参数)
php正则过滤html标签、空格、换行符等的代码示例
php实现过滤IP黑白名单的方法
很好用的php防止sql注入漏洞过滤函数的代码
php防止sql注入正则过滤一例
一段php过滤危险html的代码

    
[2]有关php内存溢出的解决方法
    来源: 互联网  发布时间: 2013-12-24

一,php内存溢出
在做数据统计分析时,经常会遇到大数组,可能会发生内存溢出。

如下:
假定日志中存放的记录数为500000条,解决方案如下:
ini_set(‘memory_limit’,’64M’); //重置php可以使用的内存大小为64M,一般在远程主机上是不能修改php.ini文件的,只能通过程序设置。注:在safe_mode(安全模式)下,ini_set失效
 

代码示例:

<?php
set_time_limit(600);//设置超时限制为6分钟
$farr = $Uarr = $Marr = $IParr = $data = $_sub = array();
$spt = ”$@#!$”;
$root = ”/Data/webapps/VisitLog”;
$path = $dpath = $fpath = NULL;
$path = $root.”/”.date(“Y-m”,$timestamp);
$dpath = $path.”/”.date(“m-d”,$timestamp);
for($j=0;$j<24;$j++){
$v = ($j < 10) ? ”0″.$j : $j;
$gpath = $dpath.”/”.$v.”.php”;
if(!file_exists($gpath)){
continue;
} else {
$arr = file($gpath);////将文件读入数组中
array_shift($arr);//移出第一个单元-》<?php exit;?>
$farr = array_merge($farr,$arr);
unset($arr);
}
}

if(empty($this->farr)){
echo ”<p><center>没有相关记录!</center></p>”;
exit;
}

while(!empty($farr)){
$_sub = array_splice($farr, 0, 10000); //每次取出$farr中1000个
for($i=0,$scount=count($_sub);$i<$scount;$i++){
$arr = explode()($spt,$_sub[$i]);
$Uarr[] = $arr[1]; //vurl
$Marr[] = $arr[2]; //vmark
$IParr[] = $arr[3].” |$nbsp;”.$arr[1]; //IP
}
unset($_sub);//用完及时销毁
}
unset($farr);
?>
 

这里,不难看出,一方面,要增加PHP可用内存大小,另一方面,只要想办法对数组进行分批处理,分而治之,将用过的变量及时销毁(unset),一般是不会出现溢出问题的。

另外,为了节省PHP程序内存损耗,我们应当尽可能减少静态变量的使用,在需要数据重用时,可以考虑使用引用(&)。
另外:数据库操作完成后,要马上关闭连接;一个对象使用完,要及时调用析构函数(__destruct())。

二,unset销毁变量并释放内存问题
PHP的unset()函数用来清除、销毁变量,不用的变量,我们可以用unset()将它销毁。但是某些时候,用unset()却无法达到销毁变 量占用的内存!我们先看一个例子:
 

代码示例:
<?php
$s=str_repeat('1',255); //产生由255个1组成的字符串
$m=memory_get_usage(); //获取当前占用内存
unset($s);
$mm=memory_get_usage(); //unset()后再查看当前占用内存
echo $m-$mm;
?>

最后输出unset()之前占用内存减去unset()之后占用内存,如果是正数,那么说明unset($s)已经将$s从内存中销毁(或者说,unset()之后内存占用减少了),可是我在PHP5和windows平台下,得到的结果是:0。这是否可以说明,unset($s)并没有起 到销毁变量$s所占用内存的作用呢?
例子:
 

代码示例:
<?php
$s=str_repeat('1',256); //产生由256个1组成的字符串
$m=memory_get_usage(); //获取当前占用内存
unset($s);
$mm=memory_get_usage(); //unset()后再查看当前占用内存
echo $m-$mm;
?>

这个例子,和上面的例子几乎相同,唯一的不同是,$s由256个1组成,即比第一个例子多了一个1,得到结果是:272。这是否可以说 明,unset($s)已经将$s所占用的内存销毁了?
通过上面两个例子,可以得出以下结论:
结论一、unset()函数只能在变量值占用内存空间超过256字节时才会释放内存空间。

那么是不是只要变量值超过256,使用unset就可以释放内存空间呢?
例子:
 

代码示例:
<?php
$s=str_repeat('1',256); //这和第二个例子完全相同
$p=&$s;
$m=memory_get_usage();
unset($s); //销毁$s
//by www.
$mm=memory_get_usage();
echo $p.'<br />';
echo $m-$mm;
?>

刷新页面,看到第一行有256个1,第二行是0,按理说已经销毁了$s,而$p只是引用$s的变量,应该是没有内容了,另外,unset($s)前后内存占用没变化!
例子:
 

代码示例:
<?php
$s=str_repeat('1',256); //这和第二个例子完全相同
$p=&$s;
$m=memory_get_usage();
$s=null; //设置$s为null
$mm=memory_get_usage();
echo $p.'<br />';
echo $m-$mm;
?>

现在刷新页面,输出$p已经是没有内容了,unset()前后内存占用量之差是272,即已经清除了变量占用的内存。
本例中的$s=null也 可以换成unset(),如下:
 

代码示例:
<?php
$s=str_repeat('1',256); //这和第二个例子完全相同
$p=&$s;
$m=memory_get_usage();
unset($s); //销毁$s
unset($p);
$mm=memory_get_usage();
echo $p.'<br />';
echo $m-$mm;
?>
 

将$s和$p都使用unset()销毁,这时再看内存占用量之差也是272,说明这样也可以释放内存。
结论二、只有当指向该变量的所有变量(如引用变量)都被销毁后,才会释放内存。


    
[3]php在字符断点处截断文字的代码一例
    来源: 互联网  发布时间: 2013-12-24

什么是断字 (word break)?,即一个单词可在转行时断开的地方。

本文介绍的函数将在断字处截断字符串。

代码如下:
 

代码示例:
<?php
//所谓断字 (word break),即一个单词可在转行时断开的地方。这一函数将在断字处截断字符串。
// Please acknowledge use of this code by including this header.
function myTruncate($string, $limit, $break=".", $pad="...") {
// return with no change if string is shorter than $limit
if(strlen($string) <= $limit)
return $string;
// is $break present between $limit and the end of the string?
if(false !== ($breakpoint = strpos($string, $break, $limit))) {
if($breakpoint < strlen($string) - 1) {
$string = substr($string, 0, $breakpoint) . $pad;
}
}
return $string;
}
/***** Example ****/
$short_string=myTruncate($long_string, 100, ' ');
?>

    
最新技术文章:
▪PHP函数microtime()时间戳的定义与用法
▪PHP单一入口之apache配置内容
▪PHP数组排序方法总结(收藏)
▪php数组排序方法大全(脚本学堂整理奉献)
▪php数组排序的几个函数(附实例)
▪php二维数组排序(实例)
▪php根据键值对二维数组排序的小例子
▪php验证码(附截图)
▪php数组长度的获取方法(三个实例)
▪php获取数组长度的方法举例
▪判断php数组维度(php数组长度)的方法
▪php获取图片的exif信息的示例代码
▪PHP 数组key长度对性能的影响实例分析
▪php函数指定默认值的方法示例
▪php提交表单到当前页面、提交表单后页面重定...
▪php四舍五入的三种实现方法
▪php获得数组长度(元素个数)的方法
▪php日期函数的简单示例代码
▪php数学函数的简单示例代码
▪php字符串函数的简单示例代码
▪php文件下载代码(多浏览器兼容、支持中文文...
▪php实现文件下载、支持中文文件名的示例代码...
▪php文件下载(防止中文文件名乱码)的示例代码
▪解决PHP文件下载时中文文件名乱码的问题
▪php数组去重(一维、二维数组去重)的简单示例
▪php小数点后取两位的三种实现方法
c/c++ iis7站长之家
▪PHP导出excel时数字变为科学计数的解决方法
▪PHP数组根据值获取Key的简单示例
▪php数组去重的函数代码示例
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3