php学习交流博客

好好写代码,好好痛她

#

jquery实现布局高宽自适应

     摘要: 大家看到这个标题,看能觉得布局这是css的工作.的确css是可以实现.前段时间一直在看jQuery 那我就想能不能用jQuery实现css的一些功能然后,就写了这个jQuery的布局自适应01 <!– 02     通过jQuery实现布局高宽自适应03     ...  阅读全文

posted @ 2010-10-17 21:13 王吉刚 阅读(573) | 评论 (0)编辑 收藏

php数据库数据转换为js中的json对象

直接上代码了.
都有详细的注释 在

有兴趣的朋友可以测试,测试…希望和大家更好的交流学习

<?php
/
1.在company数据user表中取出10条数据,保存为数组
2.在将数组转化为json格式,传递给js
3.用json解析器将传递过来的json字符串转化为json对象,
4.用document.write输出语句打印在页面上
*/

$conn = mysql_connect(“localhost”,”root”,”root”);   //连接数据库
mysql_query(“set names utf8″);                       //设置编码
mysql_select_db(“company”,$conn);                    //选择库

$sql = “select * from user limit 10″;                //在user表中查询10条数据
$res = mysql_query($sql);                            //执行sql语句
$arr = array();

while($row = mysql_fetch_array($res,MYSQL_ASSOC)){   //查询出来sql
$arr[] = $row;                                   //将查询出来的结果赋给数组$arr
}

$str = json_encode($arr);                           //将数组转化为json格式的字符串

?>

<script src=”json_parse.js”></script>                    <!– 引入json解析器 –>
<table>
<tr>
<th>uid</th><th>用户名</th><th>性别</th><th>email</th>
</tr>
<script>
var jsonString = ‘<?php echo $str;?>’;          //传递php中的数据给js

//document.write(jsonString);

var jsonObject = json_parse(jsonString);            //将json字符串转化为js中的json对象

for(var i = 0; i < jsonObject.length; i++){            //for循环打印
document.write(“<tr>”);
document.write(“<td>”,jsonObject[i].uid,”</td>”);
document.write(“<td>”,jsonObject[i].username,”</td>”);
document.write(“<td>”,jsonObject[i].sex,”</td>”);
document.write(“<td>”,jsonObject[i].email,”</td>”);
document.write(“</tr>”);
}
</script>
</table>

转载:http://jigwang.com

posted @ 2010-10-17 21:11 王吉刚 阅读(1996) | 评论 (0)编辑 收藏

submit与onsubmit

if (!theForm.onsubmit || (theForm.onsubmit() != false)) 的作用:

检查是否有onsubmit处理函数,或者存在onsubmit处理函数并且返回值不是false时提交表单 
发生顺序:onsubmit -> submit

1.阻止表单提单:

<script>
function submitFun()
{
//逻辑判断
return true; //允许表单提交
//逻辑判断
return false;//不允许表单提交
}
</script>
<form onsubmit=” reture submitFun();”> //注意此处不能写成 onsubmit=”submitFun();” 否则将表单总是提交的
</form>

2.onsubmit()与submit() :

<script>
function fun()
{
alert(“form_submit”);
}
</script>

<form onsubmit=”fun()”>
<input type=”submit” id=”aaa” value=”submit”>   <!–能弹出form_submit–>
<input type=”button” id=”bbb” value=”onclick_submit” onclick=”document.forms[0].submit()”>
<!–
表单会提交,但是不会执行fun() 原因是 onsubmit事件不能通过此种方式触发(在IE环境)
直接用脚本documetn.formName.submit()提交表单是不会触发表单的onsubmit()事件的
–>
<input type=”button” id=”bb1″ value=”onclick_onsubmit” onclick=”document.forms[0].onsubmit()”>

<!–会触发fun()函数–>
</form>

转载:http://jigwang.com

posted @ 2010-10-17 21:10 王吉刚 阅读(1261) | 评论 (0)编辑 收藏

PHP程序员不可不知的十大项目

PHP程序员不可不知的十大项目

    * 发送邮件 phpmailer 
    * 管理用户 Php user class 
    * 抓取RSS摘要 Magpie RSS 
    * 获取访问者的地理信息 Maxmind 
    * 获取远程内容 htmlSQL class 
    * Trackback php trackback 
    * 模板系统,当然就是Smarty 了 
    * BBcode StringParser_BBcode class 
    * Paypal 支付集成 paypal IPN integration class 
    * 编辑器控制 tinyMCE control

posted @ 2010-10-14 17:30 王吉刚 阅读(242) | 评论 (0)编辑 收藏

js跨域问题小结

javascript出于安全方面的考虑,是不允许跨域调用其他页面的对象的。但在安全限制的同时也给注入iframe或是ajax应用上带来了不少麻烦。没有记错的话前三届D2论坛上每次都有人提这个东西,这里把涉及到跨域的一些问题简单地整理一下:

首先什么是跨域,简单地理解就是因为javascript同源策略的限制,a.com 域名下的js无法操作b.com或是c.a.com域名下的对象。更详细的说明可以看下表:

 

URL 说明 是否允许通信
http://www.kuqin.com/lab/a.js
http://www.kuqin.com/script/b.js
同一域名下不同文件夹 允许
http://www.kuqin.com/a.js
http://www.kuqin.com/b.js
同一域名下 允许
http://www.kuqin.com:8000/a.js
http://www.kuqin.com/b.js
同一域名,不同端口 不允许
http://www.kuqin.com/a.js
https://www.kuqin.com/b.js
同一域名,不同协议 不允许
http://www.kuqin.com/a.js
http://70.32.92.74/b.js
域名和域名对应ip 不允许
http://www.kuqin.com/a.js
http://script.kuqin.com/b.js
主域相同,子域不同 不允许
http://www.ithao123.com/a.js
http://www.kuqin.com/b.js
不同域名 不允许

 

特别注意两点:

第一,如果是协议和端口造成的跨域问题“前台”是无能为力的,

第二:在跨域问题上,域仅仅是通过URL的首部来识别而不会去尝试判断相同的ip地址对应着两个域或两个域是否在同一个ip上。

接下来简单地总结一下在“前台”一般处理跨域的办法,后台proxy这种方案牵涉到后台的配置,这里就不阐述了,有兴趣的可以看看YAHOO的这篇文章:
JavaScript: Use a Web Proxy for Cross-Domain XMLHttpRequest Calls

1、document.domain+iframe的设置
对于主域相同而子域不同的例子,可以通过设置document.domain的办法来解决。具体的做法是可以在http://www.kuqin.com/a.html和http://script.kuqin.com/b.html两个文件中分别加上document.domain = ‘kuqin.com’;然后通过a.html文件中创建一个iframe,去控制iframe的contentDocument,这样两个js文件之间就可以“交互”了。当然这种办法只能解决主域相同而二级域名不同的情况,如果你异想天开的把script.kuqin.com的domian设为alibaba.com那显然是会报错地!代码如下:
www.kuqin.com上的a.html

1
2
3
4
5
6
7
8
9
        document.domain = 'kuqin.com';
	var ifr = document.createElement('iframe');
	ifr.src = 'http://script.kuqin.com/b.html';
	ifr.style.display = 'none';
	document.body.appendChild(ifr);
	ifr.onload = function(){
		var x = ifr.contentDocument;
		alert(x.getElementsByTagName("h1")[0].childNodes[0].nodeValue);
	}

script.kuqin.com上的b.html

1
 document.domain = 'kuqin.com';

2、动态创建script
虽然浏览器默认禁止了跨域访问,但并不禁止在页面中引用其他域的JS文件,并可以自由执行引入的JS文件中的function,根据这一点,可以方便地通过创建script节点的方法来实现完全跨域的通信。具体的做法可以参考yui的 Get Utility

这里判断script节点加载完毕还是蛮有意思的:ie只能通过script的readystatechange属性,Safari 3.x以上支持的是script的load事件,而firefox和oprea则要通过onload来解决。另外这种办法只能传递js类型的数据,不是很方便。以下是部分判断script加载完毕的方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
……
 
// ie支持script的readystatechange属性
// IE supports the readystatechange event for script and css nodes
if (ua.ie) {
n.onreadystatechange = function() {
var rs = this.readyState;
if ("loaded" === rs || "complete" === rs) {
n.onreadystatechange = null;
f(id, url);
}
};
 
……
 
// // Safari 3.x supports the load event for script nodes (DOM2)
 
……
 
n.addEventListener("load", function() {
f(id, url);
});
 
……
 
// FireFox and Opera support onload (but not DOM2 in FF) handlers for
// script nodes.  Opera, but not FF, supports the onload event for link
// nodes.
} else {
n.onload = function() {
f(id, url);
};
}

3、利用iframe和location.hash
这个办法比较绕,但是可以解决完全跨域情况下的脚步置换问题。原理是利用location.hash来进行传值。在url: http://kuqin.com#helloword中的‘#helloworld’就是location.hash,改变hash并不会导致页面刷新,所以可以利用hash值来进行数据传递,当然数据容量是有限的。假设域名kuqin.com下的文件cs1.html要和ithao123.com域名下的cs2.html传递信息,cs1.html首先创建自动创建一个隐藏的iframe,iframe的src指向ithao123.com域名下的cs2.html页面,这时的hash值可以做参数传递用。cs2.html响应请求后再将通过修改cs1.html的hash值来传递数据。(因为ie不允许修改parent.location.hash的值,所以要借助于kuqin.com域名下的一个代理iframe)。同时在cs1.html上加一个定时器,隔一段时间来判断location.hash的值有没有变化,一点有变化则获取获取hash值。代码如下:
先是kuqin.com下的文件cs1.html文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
	function startRequest(){
		var ifr = document.createElement('iframe');
		ifr.style.display = 'none';
		ifr.src = 'http://www.ithao123.com/lab/cscript/cs2.html#paramdo';
		document.body.appendChild(ifr);
	}
 
	function checkHash() {
		try {
			var data = location.hash ? location.hash.substring(1):'';
			if(console.log){
				console.log('Now the data is '+data);
			}
		}catch(e){};
	}
	setInterval(checkHash, 2000);

ithao123.com域名下的cs2.html:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
(function(){
	//模拟一个简单的参数处理操作
	switch(location.hash){
		case '#paramdo':
			callBack();
			break;
		case '#paramset':
			//do something……
			break;
	}
 
	function callBack(){
		try {
            parent.location.hash = 'somedata';
        } catch (e) {
        	//ie的安全机制无法修改parent.location.hash,所以要利用一个中间在ithao123域下的代理iframe
        	var ifrproxy = document.createElement('iframe');
        	ifrproxy.style.display = 'none';
        	ifrproxy.src = 'http://kuqin.com/test/cscript/cs3.html#somedata';
        	document.body.appendChild(ifrproxy);
        }
	}
})();

kuqin.com下的域名cs3.html

1
2
	//因为parent.parent和自身属于同一个域,所以ie下可以改变其location.hash的值
	parent.parent.location.hash = self.location.hash.substring(1);

实例请点击  hash实现完全跨域
当然这样做也存在很多缺点,诸如数据直接暴露在了url中,数据容量和类型都有限等……

4、利用flash
这是从YUI3的IO组件中看到的办法,具体可见:http://developer.yahoo.com/yui/3/io/
flash这个方案不是很明白,各位自己慢慢琢磨了,呵呵。你可以看在Adobe Developer Connection看到更多的跨域代理文件规范:
ross-Domain Policy File Specifications.
HTTP Headers Blacklist.

posted @ 2010-10-13 23:07 王吉刚 阅读(594) | 评论 (0)编辑 收藏

应用 memcached 提升站点性能

     摘要:   阅读全文

posted @ 2010-10-13 16:39 王吉刚 阅读(254) | 评论 (0)编辑 收藏

《Zend Framework技术大全》视频目录表

     摘要:   阅读全文

posted @ 2010-09-24 12:13 王吉刚 阅读(906) | 评论 (0)编辑 收藏

22个Web在线编辑器

     摘要:   阅读全文

posted @ 2010-09-17 18:32 王吉刚 阅读(952) | 评论 (0)编辑 收藏

背完这444句,你的口语绝对不成问题了

     摘要: 1. I see. 我明白了。  2. I quit! 我不干了!  3. Let go! 放手!  4. Me too. 我也是。  5. My god! 天哪!  6. No&...  阅读全文

posted @ 2010-09-01 21:06 王吉刚 阅读(208) | 评论 (0)编辑 收藏

PHP开发绝对不能违背的安全铁则!

作为PHP程序员,特别是新手,对于互联网的险恶总是知道的太少,对于外部的入侵有很多时候是素手无策的,他们根本不知道黑客是如何入侵的、提交入侵、上传漏洞、sql 注入、跨脚本攻击等等。作为最基本的防范你需要注意你的外部提交,做好第一面安全机制处理防火墙

  规则 1:绝不要信任外部数据或输入

  关于Web应用程序安全性,必须认识到的第一件事是不应该信任外部数据。外部数据(outside data) 包括不是由程序员在PHP代码中直接输入的任何数据。在采取措施确保安全之前,来自任何其他来源(比如 GET 变量、表单 POST、数据库、配置文件、会话变量或 Cookie)的任何数据都是不可信任的。

  例如,下面的数据元素可以被认为是安全的,因为它们是在PHP中设置的。

  1. 清单 1. 安全无暇的代码  
  2. $myUsername = ‘tmyer’;  
  3. $arrayarrayUsers = array(‘tmyer’, ‘tom’, ‘tommy’);  
  4. define(“GREETING”, ‘Hello there’ . $myUsername);  
  5. ?> 

  但是,下面的数据元素都是有瑕疵的。

  1. 清单 2. 不安全、有瑕疵的代码  
  2. $myUsername = $_POST['username']; //tainted!  
  3. $arrayarrayUsers = array($myUsername, ‘tom’, ‘tommy’); //tainted!  
  4. define(“GREETING”, ‘hello there’ . $myUsername); //tainted!  
  5. ?> 

  为什么第一个变量$myUsername 是有瑕疵的?因为它直接来自表单 POST。用户可以在这个输入域中输入任何字符串,包括用来清除文件或运行以前上传的文件的恶意命令。您可能会问,“难道不能使用只接受字母 A-Z 的客户端(Javascrīpt)表单检验脚本来避免这种危险吗?”是的,这总是一个有好处的步骤,但是正如在后面会看到的,任何人都可以将任何表单下载到自己的机器上,修改它,然后重新提交他们需要的任何内容。

  解决方案很简单:必须对$_POST['username'] 运行清理代码。如果不这么做,那么在使用$myUsername的任何其他时候(比如在数组或常量中),就可能污染这些对象。对用户输入进行清理的一个简单方法是,使用正则表达式来处理它。在这个示例中,只希望接受字母。将字符串限制为特定数量的字符,或者要求所有字母都是小写的,这可能也是个好主意。

  1. 清单 3. 使用户输入变得安全  
  2. $myUsername = cleanInput($_POST['username']); //clean!  
  3. $arrayarrayUsers = array($myUsername, ‘tom’, ‘tommy’); //clean!  
  4. define(“GREETING”, ‘hello there’ . $myUsername); //clean!  
  5. function cleanInput($input){   $clean = strtolower($input);  
  6. $clean = preg_replace(“/[^a-z]/”, “”, $clean);  
  7. $clean = substr($clean,0,12);return $clean;  
  8. }  
  9. ?> 

  规则 2:禁用那些使安全性难以实施的PHP设置

  已经知道了不能信任用户输入,还应该知道不应该信任机器上配置 PHP 的方式。例如,要确保禁用 register_globals。如果启用了 register_globals,就可能做一些粗心的事情,比如使用 $variable 替换同名的 GET 或 POST 字符串。通过禁用这个设置,PHP 强迫您在正确的名称空间中引用正确的变量。要使用来自表单 POST 的变量,应该引用 $_POST['variable']。这样就不会将这个特定变量误会成 cookie、会话或 GET 变量。

  规则 3:如果不能理解它,就不能保护它

  一些开发人员使用奇怪的语法,或者将语句组织得很紧凑,形成简短但是含义模糊的代码。这种方式可能效率高,但是如果您不理解代码正在做什么,那么就无法决定如何保护它。例如,您喜欢下面两段代码中的哪一段?

  1. 清单 4. 使代码容易得到保护  
  2. //obfuscated code  
  3. $input = (isset($_POST['username']) ? $_POST['username']:”);  
  4. //unobfuscated code  
  5. $input = ”;  
  6. if (isset($_POST['username'])){  
  7. $input = $_POST['username'];  
  8. }else{  
  9. $input = ”;  

  在第二个比较清晰的代码段中,很容易看出 $input 是有瑕疵的,需要进行清理,然后才能安全地处理。

  规则 4:“纵深防御” 是新的法宝

  本教程将用示例来说明如何保护在线表单,同时在处理表单的 PHP 代码中采用必要的措施。同样,即使使用 PHP regex 来确保 GET 变量完全是数字的,仍然可以采取措施确保 SQL 查询使用转义的用户输入。纵深防御不只是一种好思想,它可以确保您不会陷入严重的麻烦。既然已经讨论了基本规则,现在就来研究第一种威胁:SQL 注入攻击。

  ◆防止SQL注入攻击

  在SQL注入攻击中,用户通过操纵表单或 GET 查询字符串,将信息添加到数据库查询中。例如,假设有一个简单的登录数据库。这个数据库中的每个记录都有一个用户名字段和一个密码字段。构建一个登录表单,让用户能够登录。

  1. <html> 
  2. <head> 
  3. <title>Login</title> 
  4. </head> 
  5. <body> 
  6. <form action=”verify.php” method=”post”> 
  7. <p><label for=’user’>Username</label> 
  8. <input type=’text’ name=’user’ id=’user’/> 
  9. </p> <p><label for=’pw’>Password</label> 
  10. <input type=’password’ name=’pw’ id=’pw’/> 
  11. </p> <p><input type=’submit’ value=’login’/></p> 
  12. </form> 
  13. </body> 
  14. </html> 

  这个表单接受用户输入的用户名和密码,并将用户输入提交给名为verify.php的文件。在这个文件中,PHP处理来自登录表单的数据,如下所示:

  1. 清单 5. 不安全的 PHP 表单处理代码  
  2. <?php 
  3. $okay = 0;  
  4. $username = $_POST['user'];  
  5. $pw = $_POST['pw'];  
  6. $sql = “select count(*) as ctr from users where username=’
    ”.$username.”‘ and password=’”. $pw.”‘ limit 1″;  
  7. $result = MySQL_query($sql);  
  8. while ($data = mysql_fetch_object($result)){  
  9. if ($data->ctr == 1){  
  10. //they’re okay to enter The application!  
  11. $okay = 1;  
  12. }  
  13. }  
  14. if ($okay){  
  15. $_SESSION['loginokay'] = true;  
  16. header(“index.php”);  
  17. }else{  
  18. header(“login.php”);  
  19. }  
  20. ?> 

  这段代码看起来没问题,对吗?世界各地成百(甚至成千)的 PHP/MySQL 站点都在使用这样的代码。它错在哪里?好,记住 “不能信任用户输入”。这里没有对来自用户的任何信息进行转义,因此使应用程序容易受到攻击。具体来说,可能会出现任何类型的SQL注入攻击。例如,如果用户输入 foo 作为用户名,输入 ‘ or ’1′=’1 作为密码,那么实际上会将以下字符串传递给 PHP,然后将查询传递给 MySQL:

  1. <?php 
  2. $sql = “select count(*) as ctr from users where username=
    ’foo’ and password=” or ’1′=’1′ limit 1″;  
  3. ?> 

  这个查询总是返回计数值 1,因此 PHP 会允许进行访问。通过在密码字符串的末尾注入某些恶意 SQL,黑客就能装扮成合法的用户。解决这个问题的办法是,将 PHP 的内置 mysql_real_escape_string() 函数用作任何用户输入的包装器。这个函数对字符串中的字符进行转义,使字符串不可能传递撇号等特殊字符并让 MySQL 根据特殊字符进行操作。清单7展示了带转义处理的代码。

  1. 清单7展示了带转义处理的代码  
  2. <?php    
  3. $okay = 0;    
  4. $username = $_POST['user'];    
  5. $pw = $_POST['pw'];    
  6. $sql = "select count(*) as ctr from users where username='".mysql_real_
    _string($username)."' and password='". mysql_real_escape_string($pw)."'
     limit 1";     
  7. $result = mysql_query($sql);    
  8. while ($data = mysql_fetch_object($result)){        
  9.        if ($data->ctr == 1){          //they're okay to enter the 
    application!            
  10.        $okay = 1;         
  11.        }    
  12.       }    
  13.        if ($okay){        
  14.            $_SESSION['loginokay'] = true;        
  15.            header("index.php");    
  16.            }  
  17.         else{        
  18.         header("login.php");    
  19.       }    
  20. ?> 

  使用 mysql_real_escape_string() 作为用户输入的包装器,就可以避免用户输入中的任何恶意 SQL 注入。如果用户尝试通过 SQL 注入传递畸形的密码,那么会将以下查询传递给数据库:

  1. select count(*) as ctr from users where username=’foo’ and password=
    ’\’ or \’1\’=\’1′ limit 1″

posted @ 2010-08-28 20:15 王吉刚 阅读(257) | 评论 (0)编辑 收藏

仅列出标题
共8页: 1 2 3 4 5 6 7 8