0

我正在尝试构建一个安全的 php 联系表单以允许用户(希望不是垃圾邮件发送者)发送邮件。

我正在研究在 from: 字段中检测新行的方法,用户将使用该字段提交他们的电子邮件地址和 subject: 字段。

我有 2 种替代方法来检测新行,我希望您能就哪一种最可靠(意味着在大多数情况下工作)提出意见:

function containingnewlines1($stringtotest) {
    if (preg_match("/(%0A|%0D|\\n+|\\r+)/i", $stringtotest) != 0) {
        echo "Newline found. Suspected injection attempt";
        exit;
    }
}

function containingnewlines2($stringtotest) {
    if (preg_match("/^\R$/", $stringtotest) != 0) {
        echo "Newline found. Suspected injection attempt";
        exit;
    }
}

提前感谢您的意见!

干杯

4

3 回答 3

1

更相关的问题是“哪个更可靠?”。两种方法的效率都无关紧要,因为两种方法的执行时间都不应该超过几毫秒。试图根据毫秒在两者之间做出决定是一种

此外,您所说的效率是什么意思?你的意思是哪个更快?哪一个消耗的内存最少?效率是一个定义不明确的术语,您需要更具体。

如果您绝对必须根据性能/效率要求做出决定,那么我建议您构建一个基准并自己找出最符合您要求的基准,因为最终只有您可以回答这个问题。

于 2012-06-27T10:30:11.350 回答
0

实际上,我决定使用第一个函数,因为它涵盖了另外 2 种情况(%OA 和 %OD),并且它还包括不同操作系统使用的所有换行符变体(\n、\n\r 等)。

于 2012-06-27T13:09:08.350 回答
0

我又给自己添加了 2 个函数并做了一个100000循环基准测试:

function containingnewlines3($stringtotest) {
   return (strpbrk($stringtotest,"\r\n") !== FALSE);
}

function containingnewlines4($stringtotest) {
   return (strpos($stringtotest,"\n") !== FALSE && strpos($stringtotest,"\r\n") !== FALSE);
}

$start = microtime(TRUE);
for($x=0;$x<100000;$x++) {
   containingnewlines1($html);   // 0.272623 ms
   containingnewlines2($html);   // 0.244299 ms
   containingnewlines3($html);   // 0.377767 ms
   containingnewlines4($html);   // 0.142282 ms
}
echo (microtime(TRUE) - $start);
于 2012-06-27T10:50:55.010 回答