2013-02-07 56 views
1

在PHP中,我有以下reqular表达:正则表达式替换

$regexp = "/^([-a-z0-9.,[email protected]'?_-\s])+$/i"; 

我试着去验证我的网站上的联系方式(特别是消息字段),以确保没有讨厌的代码已被输入。我遇到的问题是我需要允许某些正常的标点符号和字符,但是我担心它们可能会被用于插入恶意代码。

对于任何不服从上述表达式的字符,我想将其替换以使其安全。两个问题:

  1. 如何更换?
  2. 我应该用什么替换角色?例如,我不允许括号()。最好的做法是将其替换为"(" ")"\(\)

编辑

的数据将被发送到电子邮件地址,并保存到数据库

+0

为什么你担心联系表单中的恶意代码?信息在哪里去?另一个网站?你的邮件?你可能会过度这样做。 –

+3

根据您使用它的位置转移数据。如果插入到数据库中,请使用PDO或正确的* _escape函数。在网站上输出时,请使用htmlspecialchars和urlencode。在shell环境中使用时,escapeshellcmd/escapeshellarg。等等...请参阅问题[»用PHP清理用户输入的最佳方法是什么?](http://stackoverflow.com/q/129677/112968) – knittl

+0

这一切都取决于正在处理的数据。如果它被输出到浏览器,插入数据库,通过一些命令行运行,都需要不同的卫生手段。 –

回答

1

Mmh的你为什么不只是允许接触形式插入每个字符,将他们全部在表单提交之后,只要他们到达php脚本,立刻使用htmlentities?这样,你的用户将能够说出他们想要什么,你不会有“恶意代码” :)

And do not forget to use a proper database wrapper (PDO) 
or at least escape when inserting into the database. 

– knittl 

编辑任何问题:加入Knittl的报价再次强调它:)

+1

不要忘记使用正确的数据库包装(PDO) - 或者至少在插入到数据库时进行转义。 – knittl

+1

是的。没有对它说什么,因为它在你对这个问题的评论中告诉你:) –

+2

你不能强调这一点。 – knittl

0

使用filter extension。更具体地说,使用filter_input()函数和sanitizing filter。例如:

$message = filter_input(INPUT_POST, 'message', FILTER_SANITIZE_STRING); 

这将确保标签被剥离出消息,并且处理更安全。

但是,它确实是而不是表示您应该将其视为100%安全。将消息保存到数据库时,您仍然需要采取防范措施(例如使用数据库驱动程序的转义方法,并从消息中删除不需要/不需要/可疑的东西),并确保输出到客户端是安全的。