使用 PHP 编码的网站搜索(使用 .txt 文件作为索引文件)是否容易受到任何攻击(如 SQL 注入和 XSS)?
Whether a website search coded with PHP (with .txt file as indexing file) vulnerable to any attacks (like SQL Injection & XSS)?
我有一个用 PHP 编码的网站搜索。它本质上是一个 PHP-AJAX 搜索,在搜索输入字段的 onkeyup
事件上触发。 onkeyup
触发对 PHP 文件的 AJAX 调用,该文件通过使用 PHP 的 file()
函数读取包含索引的 indexes-file.txt
文件。
虽然,这里我不是在处理数据库,所以我认为没有机会进行 SQL-注入或 XSS 攻击(如果我错了请纠正我)。
此外,我知道 mysqli_real_escape_string()
和 htmlentities()
函数、它们的重要性和用例。我想知道的是这个特定的 PHP-AJAX 方法是否容易受到攻击。
另外,除了服务端漏洞,此类案例是否还存在其他类型的漏洞?
onkeyup
函数是:
function results(str) {
var search_term = $("#search")
.val()
.trim();
if (search_term == "") {
// ...
} else {
$.ajax({
url: "websearch.php",
type: "post",
data: {
string: search_term
},
dataType: "json",
success: function(returnData) {
for(var i in returnData) {
for(var j in returnData[i]) {
$('#results').append('<div><a target="_blank" href="'+returnData[i][j]+'">'+Object.keys(returnData[i])+'</a></div>');
}
}
}
});
}
}
indexes-file.txt
包含:
books*books.php
newspaper*newspaper.php
download manual*manual.php
...
我的 websearch.php
文件包含:
<?php
error_reporting(0);
$indexes = 'indexes-file.txt';
$index_array = file($indexes, FILE_IGNORE_NEW_LINES);
foreach($index_array as $st) {
$section = explode('*', $st);
$k = $section[0];
$kklink = $section[1];
$l_arr[] = array($k => $kklink);
}
//Get the search term from "string" POST variable.
$var1 = isset($_POST['string']) ? trim($_POST['string']) : '';
$webresults = array();
//Loop through our lookup array.
foreach($l_arr as $kk){
//If the search term is present.
if(stristr(key($kk), $var1)){
//Add it to the results array.
foreach($kk as $value) {
$webresults[] = array(key($kk) => $value);
}
}
}
//Display the results in JSON format so to parse it with JavaScript.
echo json_encode($webresults);
?>
如果您不处理数据库,它可能不易受到 sql 注入攻击,但它可能容易受到 xss 攻击,以防止 xss 和脚本执行,您应该使用:
防止 XSS
PHP htmlentities()
函数
过滤输入的基本示例
<?php
echo '<script>alert("vulnerable");</script>'; //vulnerable to xss
?>
使用 htmlentities() 过滤输入
<?php
$input = '<script>alert("vulnerable");</script>';
echo htmlentities($input); //not vulnerable to external input code injection scripts
?>
所以它可以防止脚本和 html 标签注入在现场执行
read more here
对于数据库,您应该将 pdo 与准备好的语句一起使用
防止SQL注入
使用 PDO
正确设置连接
请注意,当使用 PDO 访问 MySQL 数据库时,默认情况下不会使用真正的准备好的语句。要解决此问题,您必须禁用准备好的语句的模拟。使用 PDO 创建连接的示例是:
$dbConnection = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'password');
$dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
修复您的代码
<?php
error_reporting(0);
$indexes = 'indexes-file.txt';
$index_array = file($indexes, FILE_IGNORE_NEW_LINES);
foreach($index_array as $st) {
$section = explode('*', $st);
$k = $section[0];
$kklink = $section[1];
$l_arr[] = array($k => $kklink);
}
//Get the search term from "string" POST variable.
$var1 = isset($_POST['string']) ? trim($_POST['string']) : '';
$webresults = array();
//Loop through our lookup array.
foreach($l_arr as $kk){
//If the search term is present.
if(stristr(key($kk), $var1)){
//Add it to the results array.
foreach($kk as $value) {
$webresults[] = array(key($kk) => $value);
}
}
}
//Display the results in JSON format so to parse it with JavaScript.
echo htmlentities(json_encode($webresults));
//fixed
?>
每次你回显来自外部的东西时使用htmlentities
echo htmlentities(json_encode($webresults));
你的数组问题我用演示测试过 json 字符串它工作正常
<?php
$webresults =
'
{ "aliceblue": "#f0f8ff",
"antiquewhite": "#faebd7",
"aqua": "#00ffff",
"aquamarine": "#7fffd4",
"azure": "#f0ffff",
"beige": "#f5f5dc",
"bisque": "#ffe4c4",
"black": "#000000",
}';
echo htmlentities(json_encode($webresults));
?>
我有一个用 PHP 编码的网站搜索。它本质上是一个 PHP-AJAX 搜索,在搜索输入字段的 onkeyup
事件上触发。 onkeyup
触发对 PHP 文件的 AJAX 调用,该文件通过使用 PHP 的 file()
函数读取包含索引的 indexes-file.txt
文件。
虽然,这里我不是在处理数据库,所以我认为没有机会进行 SQL-注入或 XSS 攻击(如果我错了请纠正我)。
此外,我知道 mysqli_real_escape_string()
和 htmlentities()
函数、它们的重要性和用例。我想知道的是这个特定的 PHP-AJAX 方法是否容易受到攻击。
另外,除了服务端漏洞,此类案例是否还存在其他类型的漏洞?
onkeyup
函数是:
function results(str) {
var search_term = $("#search")
.val()
.trim();
if (search_term == "") {
// ...
} else {
$.ajax({
url: "websearch.php",
type: "post",
data: {
string: search_term
},
dataType: "json",
success: function(returnData) {
for(var i in returnData) {
for(var j in returnData[i]) {
$('#results').append('<div><a target="_blank" href="'+returnData[i][j]+'">'+Object.keys(returnData[i])+'</a></div>');
}
}
}
});
}
}
indexes-file.txt
包含:
books*books.php
newspaper*newspaper.php
download manual*manual.php
...
我的 websearch.php
文件包含:
<?php
error_reporting(0);
$indexes = 'indexes-file.txt';
$index_array = file($indexes, FILE_IGNORE_NEW_LINES);
foreach($index_array as $st) {
$section = explode('*', $st);
$k = $section[0];
$kklink = $section[1];
$l_arr[] = array($k => $kklink);
}
//Get the search term from "string" POST variable.
$var1 = isset($_POST['string']) ? trim($_POST['string']) : '';
$webresults = array();
//Loop through our lookup array.
foreach($l_arr as $kk){
//If the search term is present.
if(stristr(key($kk), $var1)){
//Add it to the results array.
foreach($kk as $value) {
$webresults[] = array(key($kk) => $value);
}
}
}
//Display the results in JSON format so to parse it with JavaScript.
echo json_encode($webresults);
?>
如果您不处理数据库,它可能不易受到 sql 注入攻击,但它可能容易受到 xss 攻击,以防止 xss 和脚本执行,您应该使用:
防止 XSS
PHP htmlentities()
函数
过滤输入的基本示例
<?php
echo '<script>alert("vulnerable");</script>'; //vulnerable to xss
?>
使用 htmlentities() 过滤输入
<?php
$input = '<script>alert("vulnerable");</script>';
echo htmlentities($input); //not vulnerable to external input code injection scripts
?>
所以它可以防止脚本和 html 标签注入在现场执行 read more here
对于数据库,您应该将 pdo 与准备好的语句一起使用
防止SQL注入
使用 PDO
正确设置连接
请注意,当使用 PDO 访问 MySQL 数据库时,默认情况下不会使用真正的准备好的语句。要解决此问题,您必须禁用准备好的语句的模拟。使用 PDO 创建连接的示例是:
$dbConnection = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'password');
$dbConnection->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$dbConnection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
修复您的代码
<?php
error_reporting(0);
$indexes = 'indexes-file.txt';
$index_array = file($indexes, FILE_IGNORE_NEW_LINES);
foreach($index_array as $st) {
$section = explode('*', $st);
$k = $section[0];
$kklink = $section[1];
$l_arr[] = array($k => $kklink);
}
//Get the search term from "string" POST variable.
$var1 = isset($_POST['string']) ? trim($_POST['string']) : '';
$webresults = array();
//Loop through our lookup array.
foreach($l_arr as $kk){
//If the search term is present.
if(stristr(key($kk), $var1)){
//Add it to the results array.
foreach($kk as $value) {
$webresults[] = array(key($kk) => $value);
}
}
}
//Display the results in JSON format so to parse it with JavaScript.
echo htmlentities(json_encode($webresults));
//fixed
?>
每次你回显来自外部的东西时使用htmlentities
echo htmlentities(json_encode($webresults));
你的数组问题我用演示测试过 json 字符串它工作正常
<?php
$webresults =
'
{ "aliceblue": "#f0f8ff",
"antiquewhite": "#faebd7",
"aqua": "#00ffff",
"aquamarine": "#7fffd4",
"azure": "#f0ffff",
"beige": "#f5f5dc",
"bisque": "#ffe4c4",
"black": "#000000",
}';
echo htmlentities(json_encode($webresults));
?>